Merge "Fix bad historical time when multiple pointers are present" into androidx-main
diff --git a/activity/activity-ktx/api/api_lint.ignore b/activity/activity-ktx/api/api_lint.ignore
deleted file mode 100644
index 7586506..0000000
--- a/activity/activity-ktx/api/api_lint.ignore
+++ /dev/null
@@ -1,7 +0,0 @@
-// Baseline format: 1.0
-MissingNullability: androidx.activity.ActivityViewModelLazyKt#viewModels(androidx.activity.ComponentActivity, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>):
-    Missing nullability on method `viewModels` return
-
-
-RegistrationName: androidx.activity.OnBackPressedDispatcherKt#addCallback(androidx.activity.OnBackPressedDispatcher, androidx.lifecycle.LifecycleOwner, boolean, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit>):
-    Callback methods should be named register/unregister; was addCallback
diff --git a/activity/activity-ktx/lint-baseline.xml b/activity/activity-ktx/lint-baseline.xml
new file mode 100644
index 0000000..f4a0fe0
--- /dev/null
+++ b/activity/activity-ktx/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/PipHintTracker.kt"/>
+    </issue>
+
+</issues>
diff --git a/activity/activity/lint-baseline.xml b/activity/activity/lint-baseline.xml
new file mode 100644
index 0000000..bcd3963
--- /dev/null
+++ b/activity/activity/lint-baseline.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="        @RequiresApi(18)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/ComponentActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (19 &lt;= SDK_INT &amp;&amp; SDK_INT &lt;= 23) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/ComponentActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (SDK_INT &lt; Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/ComponentActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/ComponentActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/ComponentActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/ImmLeaksCleaner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/PickVisualMediaRequest.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/result/PickVisualMediaRequest.kt"/>
+    </issue>
+
+</issues>
diff --git a/activity/integration-tests/testapp/lint-baseline.xml b/activity/integration-tests/testapp/lint-baseline.xml
index 2790d4a..b0521cd 100644
--- a/activity/integration-tests/testapp/lint-baseline.xml
+++ b/activity/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-alpha05" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-alpha05)" variant="all" version="8.0.0-alpha05">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (android.os.Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/integration/testapp/MainActivity.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (android.os.Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/activity/integration/testapp/MainActivity.kt"/>
+    </issue>
 
     <issue
         id="UnknownNullness"
diff --git a/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RequiresAndroidApi.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RequiresAndroidApi.kt
deleted file mode 100644
index 95d4458..0000000
--- a/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RequiresAndroidApi.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.annotation
-
-/**
- * Denotes that the annotated element should only be called on the given Android API level or
- * higher.
- */
-@MustBeDocumented
-@Retention(AnnotationRetention.BINARY)
-@Target(
-    AnnotationTarget.ANNOTATION_CLASS,
-    AnnotationTarget.CLASS,
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY_GETTER,
-    AnnotationTarget.PROPERTY_SETTER,
-    AnnotationTarget.CONSTRUCTOR,
-    AnnotationTarget.FIELD,
-    AnnotationTarget.FILE
-)
-@Suppress("SupportAnnotationUsage")
-@OptIn(ExperimentalMultiplatform::class)
-@OptionalExpectation
-public expect annotation class RequiresAndroidApi(
-    /** The API level to require. Alias for [.api] which allows you to leave out the `api=` part. */
-    @IntRange(from = 1) val value: Int = 1,
-    /** The API level to require */
-    @IntRange(from = 1) val api: Int = 1
-)
diff --git a/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RequiresApi.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RequiresApi.kt
new file mode 100644
index 0000000..54cacc6
--- /dev/null
+++ b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RequiresApi.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.annotation
+
+/**
+ * Denotes that the annotated element should only be called on the given Android API level or
+ * higher.
+ *
+ * This is similar in purpose to the older `@TargetApi` annotation, but more clearly expresses that
+ * this is a requirement on the caller, rather than being used to "suppress" warnings within the
+ * method that exceed the `minSdkVersion`.
+ *
+ * For API requirements on SDK extensions, see the [androidx.annotation.RequiresExtension]
+ * annotation.
+ */
+@MustBeDocumented
+@Retention(AnnotationRetention.BINARY)
+@Target(
+    AnnotationTarget.ANNOTATION_CLASS,
+    AnnotationTarget.CLASS,
+    AnnotationTarget.FUNCTION,
+    AnnotationTarget.PROPERTY_GETTER,
+    AnnotationTarget.PROPERTY_SETTER,
+    AnnotationTarget.CONSTRUCTOR,
+    AnnotationTarget.FIELD,
+    AnnotationTarget.FILE
+)
+@Suppress("SupportAnnotationUsage")
+@OptIn(ExperimentalMultiplatform::class)
+@OptionalExpectation // Need to use expect due to Java-specific target annotations on the actual.
+public expect annotation class RequiresApi(
+    /** The API level to require. Alias for [.api] which allows you to leave out the `api=` part. */
+    @IntRange(from = 1) val value: Int = 1,
+    /** The API level to require */
+    @IntRange(from = 1) val api: Int = 1
+)
diff --git a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresAndroidApi.jvm.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresAndroidApi.jvm.kt
deleted file mode 100644
index 17da9b0..0000000
--- a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresAndroidApi.jvm.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.annotation
-
-public actual typealias RequiresAndroidApi = RequiresApi
diff --git a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.jvm.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.jvm.kt
new file mode 100644
index 0000000..9ede8c5
--- /dev/null
+++ b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.jvm.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.annotation
+
+import java.lang.annotation.ElementType.CONSTRUCTOR
+import java.lang.annotation.ElementType.FIELD
+import java.lang.annotation.ElementType.METHOD
+import java.lang.annotation.ElementType.PACKAGE
+import java.lang.annotation.ElementType.TYPE
+
+/**
+ * Denotes that the annotated element should only be called on the given API level or higher.
+ *
+ * This is similar in purpose to the older `@TargetApi` annotation, but more clearly expresses that
+ * this is a requirement on the caller, rather than being used to "suppress" warnings within the
+ * method that exceed the `minSdkVersion`.
+ *
+ * For API requirements on SDK extensions, see the [RequiresExtension] annotation.
+ */
+@MustBeDocumented
+@Retention(AnnotationRetention.BINARY)
+@Target(
+    AnnotationTarget.ANNOTATION_CLASS,
+    AnnotationTarget.CLASS,
+    AnnotationTarget.FUNCTION,
+    AnnotationTarget.PROPERTY_GETTER,
+    AnnotationTarget.PROPERTY_SETTER,
+    AnnotationTarget.CONSTRUCTOR,
+    AnnotationTarget.FIELD,
+    AnnotationTarget.FILE
+)
+// Needed due to Kotlin's lack of PACKAGE annotation target
+// https://youtrack.jetbrains.com/issue/KT-45921
+@Suppress("DEPRECATED_JAVA_ANNOTATION", "SupportAnnotationUsage")
[email protected](TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE)
+public actual annotation class RequiresApi(
+    /** The API level to require. Alias for [.api] which allows you to leave out the `api=` part. */
+    @IntRange(from = 1) actual val value: Int = 1,
+    /** The API level to require */
+    @IntRange(from = 1) actual val api: Int = 1
+)
diff --git a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt
deleted file mode 100644
index a2abcb2..0000000
--- a/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.annotation
-
-import java.lang.annotation.ElementType.CONSTRUCTOR
-import java.lang.annotation.ElementType.FIELD
-import java.lang.annotation.ElementType.METHOD
-import java.lang.annotation.ElementType.PACKAGE
-import java.lang.annotation.ElementType.TYPE
-
-/**
- * Denotes that the annotated element should only be called on the given API level or higher.
- *
- * This is similar in purpose to the older `@TargetApi` annotation, but more clearly expresses that
- * this is a requirement on the caller, rather than being used to "suppress" warnings within the
- * method that exceed the `minSdkVersion`.
- *
- * For API requirements on SDK extensions, see the [RequiresExtension] annotation.
- */
-@MustBeDocumented
-@Retention(AnnotationRetention.BINARY)
-@Target(
-    AnnotationTarget.ANNOTATION_CLASS,
-    AnnotationTarget.CLASS,
-    AnnotationTarget.FUNCTION,
-    AnnotationTarget.PROPERTY_GETTER,
-    AnnotationTarget.PROPERTY_SETTER,
-    AnnotationTarget.CONSTRUCTOR,
-    AnnotationTarget.FIELD,
-    AnnotationTarget.FILE
-)
-// Needed due to Kotlin's lack of PACKAGE annotation target
-// https://youtrack.jetbrains.com/issue/KT-45921
-@Suppress("DEPRECATED_JAVA_ANNOTATION", "SupportAnnotationUsage")
[email protected](TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE)
-public annotation class RequiresApi(
-    /** The API level to require. Alias for [.api] which allows you to leave out the `api=` part. */
-    @IntRange(from = 1) val value: Int = 1,
-    /** The API level to require */
-    @IntRange(from = 1) val api: Int = 1
-)
diff --git a/appcompat/appcompat-resources/api/api_lint.ignore b/appcompat/appcompat-resources/api/api_lint.ignore
index dd0cf8d..0cfa261 100644
--- a/appcompat/appcompat-resources/api/api_lint.ignore
+++ b/appcompat/appcompat-resources/api/api_lint.ignore
@@ -17,8 +17,6 @@
     Missing nullability on parameter `tint` in method `setTintList`
 MissingNullability: androidx.appcompat.graphics.drawable.DrawableWrapperCompat#DrawableWrapperCompat(android.graphics.drawable.Drawable) parameter #0:
     Missing nullability on parameter `drawable` in method `DrawableWrapperCompat`
-MissingNullability: androidx.appcompat.graphics.drawable.DrawableWrapperCompat#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.appcompat.graphics.drawable.DrawableWrapperCompat#getCurrent():
     Missing nullability on method `getCurrent` return
 MissingNullability: androidx.appcompat.graphics.drawable.DrawableWrapperCompat#getPadding(android.graphics.Rect) parameter #0:
diff --git a/appcompat/appcompat-resources/lint-baseline.xml b/appcompat/appcompat-resources/lint-baseline.xml
index 296a941..e8d403b 100644
--- a/appcompat/appcompat-resources/lint-baseline.xml
+++ b/appcompat/appcompat-resources/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-beta03" type="baseline" client="cli" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Call requires API level 21 (current min is 14): `android.graphics.drawable.Drawable#getColorFilter`"
+        message="Call requires API level 21 (current min is 19): `android.graphics.drawable.Drawable#getColorFilter`"
         errorLine1="        assertNotNull(ld.getDrawable(0).getColorFilter());"
         errorLine2="                                        ~~~~~~~~~~~~~~">
         <location
@@ -101,6 +101,114 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/resources/Compatibility.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/resources/Compatibility.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/DrawableUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/DrawableUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 15 &amp;&amp; drawable instanceof InsetDrawable) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/DrawableUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT &lt; 15 &amp;&amp; drawable instanceof GradientDrawable) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/DrawableUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT &lt; 17 &amp;&amp; drawable instanceof LayerDrawable) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/DrawableUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/DrawableUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/ResourcesWrapper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/ResourcesWrapper.java"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="The getter return type (`Theme`) and setter parameter type (`int`) getter and setter methods for property `theme` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public Resources.Theme getTheme() {"
diff --git a/appcompat/appcompat/api/api_lint.ignore b/appcompat/appcompat/api/api_lint.ignore
index 90541cfd..94f4148 100644
--- a/appcompat/appcompat/api/api_lint.ignore
+++ b/appcompat/appcompat/api/api_lint.ignore
@@ -551,8 +551,6 @@
     Missing nullability on parameter `attrs` in method `createView`
 MissingNullability: androidx.appcompat.graphics.drawable.DrawerArrowDrawable#DrawerArrowDrawable(android.content.Context) parameter #0:
     Missing nullability on parameter `context` in method `DrawerArrowDrawable`
-MissingNullability: androidx.appcompat.graphics.drawable.DrawerArrowDrawable#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.appcompat.graphics.drawable.DrawerArrowDrawable#getPaint():
     Missing nullability on method `getPaint` return
 MissingNullability: androidx.appcompat.graphics.drawable.DrawerArrowDrawable#setColorFilter(android.graphics.ColorFilter) parameter #0:
@@ -725,8 +723,6 @@
     Missing nullability on parameter `p` in method `generateLayoutParams`
 MissingNullability: androidx.appcompat.widget.LinearLayoutCompat#getDividerDrawable():
     Missing nullability on method `getDividerDrawable` return
-MissingNullability: androidx.appcompat.widget.LinearLayoutCompat#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.appcompat.widget.LinearLayoutCompat#onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent) parameter #0:
     Missing nullability on parameter `event` in method `onInitializeAccessibilityEvent`
 MissingNullability: androidx.appcompat.widget.LinearLayoutCompat#onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo) parameter #0:
@@ -797,8 +793,6 @@
     Missing nullability on parameter `source` in method `onShareTargetSelected`
 MissingNullability: androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener#onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider, android.content.Intent) parameter #1:
     Missing nullability on parameter `intent` in method `onShareTargetSelected`
-MissingNullability: androidx.appcompat.widget.SwitchCompat#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `c` in method `draw`
 MissingNullability: androidx.appcompat.widget.SwitchCompat#getTextOff():
     Missing nullability on method `getTextOff` return
 MissingNullability: androidx.appcompat.widget.SwitchCompat#getTextOn():
@@ -833,8 +827,6 @@
     Missing nullability on parameter `thumb` in method `setThumbDrawable`
 MissingNullability: androidx.appcompat.widget.SwitchCompat#setTrackDrawable(android.graphics.drawable.Drawable) parameter #0:
     Missing nullability on parameter `track` in method `setTrackDrawable`
-MissingNullability: androidx.appcompat.widget.SwitchCompat#verifyDrawable(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `who` in method `verifyDrawable`
 MissingNullability: androidx.appcompat.widget.Toolbar#checkLayoutParams(android.view.ViewGroup.LayoutParams) parameter #0:
     Missing nullability on parameter `p` in method `checkLayoutParams`
 MissingNullability: androidx.appcompat.widget.Toolbar#generateDefaultLayoutParams():
@@ -907,6 +899,10 @@
     Missing nullability on parameter `out` in method `writeToParcel`
 
 
+NotCloseable: androidx.appcompat.view.ActionMode:
+    Classes that release resources (finish()) should implement AutoCloseable and CloseGuard: class androidx.appcompat.view.ActionMode
+
+
 ParcelConstructor: androidx.appcompat.widget.Toolbar.SavedState#SavedState(android.os.Parcel):
     Parcelable inflation is exposed through CREATOR, not raw constructors, in androidx.appcompat.widget.Toolbar.SavedState
 
diff --git a/appcompat/appcompat/lint-baseline.xml b/appcompat/appcompat/lint-baseline.xml
index d2600ce..871f6d7 100644
--- a/appcompat/appcompat/lint-baseline.xml
+++ b/appcompat/appcompat/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Class requires API level 21 (current min is 14): `android.graphics.drawable.AnimatedStateListDrawable`"
+        message="Class requires API level 21 (current min is 19): `android.graphics.drawable.AnimatedStateListDrawable`"
         errorLine1="                || button instanceof AnimatedStateListDrawable);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -12,7 +12,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 25 (current min is 14): `new android.view.inputmethod.InputContentInfo`"
+        message="Call requires API level 25 (current min is 19): `new android.view.inputmethod.InputContentInfo`"
         errorLine1="        final InputContentInfo contentInfo = new InputContentInfo("
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -21,7 +21,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 25 (current min is 14): `android.view.inputmethod.InputConnection#commitContent`"
+        message="Call requires API level 25 (current min is 19): `android.view.inputmethod.InputConnection#commitContent`"
         errorLine1="        return ic.commitContent(contentInfo, flags, null);"
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
@@ -30,7 +30,7 @@
 
     <issue
         id="NewApi"
-        message="Class requires API level 26 (current min is 14): `android.view.textclassifier.TextClassifier`"
+        message="Class requires API level 26 (current min is 19): `android.view.textclassifier.TextClassifier`"
         errorLine1="    private static class NoOpTextClassifier implements TextClassifier {}"
         errorLine2="                                                       ~~~~~~~~~~~~~~">
         <location
@@ -39,7 +39,7 @@
 
     <issue
         id="NewApi"
-        message="Class requires API level 21 (current min is 14): `android.graphics.drawable.AnimatedStateListDrawable`"
+        message="Class requires API level 21 (current min is 19): `android.graphics.drawable.AnimatedStateListDrawable`"
         errorLine1="                || button instanceof AnimatedStateListDrawable);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -48,25 +48,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 17 (current min is 14): `android.view.ContextThemeWrapper#applyOverrideConfiguration`"
-        errorLine1="        wrappedBase.applyOverrideConfiguration(overrideConfig);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/appcompat/widget/AppCompatSpinnerRtlActivity.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `android.view.ContextThemeWrapper#applyOverrideConfiguration`"
-        errorLine1="            wrappedBase.applyOverrideConfiguration(overrideConfig);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/appcompat/testutils/BaseTestActivity.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 20 (current min is 14): `android.view.WindowInsets#getSystemWindowInsetTop`"
+        message="Call requires API level 20 (current min is 19): `android.view.WindowInsets#getSystemWindowInsetTop`"
         errorLine1="        mSystemWindowInsetTop = insets.getSystemWindowInsetTop();"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -74,60 +56,6 @@
     </issue>
 
     <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES"
-        errorLine2="                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/appcompat/app/NightModeLocalBeforeAttachBaseActivity.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES"
-        errorLine2="                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/appcompat/app/NightModeLocalBeforeAttachBaseActivity.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 16): `android.content.res.Configuration#setLayoutDirection`"
-        errorLine1="        configuration.setLayoutDirection(locale)"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/appcompat/app/NightModeRtlTestUtilsRegressionTestCase.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 16): `android.content.res.Configuration#setLocale`"
-        errorLine1="        configuration.setLocale(locale)"
-        errorLine2="                      ~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/appcompat/app/NightModeRtlTestUtilsRegressionTestCase.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 16): `android.content.res.Configuration#getLayoutDirection`"
-        errorLine1="        assertEquals(TextUtils.getLayoutDirectionFromLocale(CUSTOM_LOCALE), config.layoutDirection)"
-        errorLine2="                                                                                   ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/appcompat/app/NightModeRtlTestUtilsRegressionTestCase.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 16): `android.text.TextUtils#getLayoutDirectionFromLocale`"
-        errorLine1="        assertEquals(TextUtils.getLayoutDirectionFromLocale(CUSTOM_LOCALE), config.layoutDirection)"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/appcompat/app/NightModeRtlTestUtilsRegressionTestCase.kt"/>
-    </issue>
-
-    <issue
         id="BanSynchronizedMethods"
         message="Use of synchronized methods is not recommended"
         errorLine1="    public static synchronized void preload() {"
@@ -461,6 +389,639 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="        @RequiresApi(18)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/view/ActionBarPolicy.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatCompoundButtonHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    private static final boolean sCanApplyOverrideConfiguration = Build.VERSION.SDK_INT >= 17;"
+        errorLine2="                                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17 &amp;&amp; (drawableStart != null || drawableEnd != null)) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        final int maxLines = Build.VERSION.SDK_INT >= 16 ? Api16Impl.getMaxLines(mTextView) : -1;"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                (Build.VERSION.SDK_INT >= 15 &amp;&amp; !ViewCompat.hasOnClickListeners(view))) {"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19 || Build.VERSION.SDK_INT > 28) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 18 &amp;&amp; ctitle != null &amp;&amp; !(ctitle instanceof String)) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 17"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="        @RequiresApi(17)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/ResourcesFlusher.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/app/ResourcesFlusher.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/Toolbar.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/ViewUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appcompat/widget/ViewUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v16`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
+        <location
+            file="src/main/res/values-v16"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v17`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
+        <location
+            file="src/main/res/values-v17"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v18`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
+        <location
+            file="src/main/res/values-v18"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="The getter return type (`View`) and setter parameter type (`ScrollingTabContainerView`) getter and setter methods for property `tabContainer` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public View getTabContainer() {"
diff --git a/appcompat/appcompat/src/androidTest/AndroidManifest.xml b/appcompat/appcompat/src/androidTest/AndroidManifest.xml
index aa16fad..71c9ecf 100644
--- a/appcompat/appcompat/src/androidTest/AndroidManifest.xml
+++ b/appcompat/appcompat/src/androidTest/AndroidManifest.xml
@@ -18,7 +18,6 @@
     xmlns:tools="http://schemas.android.com/tools">
 
     <uses-sdk
-        android:minSdkVersion="14"
         tools:overrideLibrary="android_libs.ub_uiautomator, androidx.test.uiautomator" />
 
     <application
diff --git a/appsearch/appsearch-builtin-types/lint-baseline.xml b/appsearch/appsearch-builtin-types/lint-baseline.xml
new file mode 100644
index 0000000..eb18f46
--- /dev/null
+++ b/appsearch/appsearch-builtin-types/lint-baseline.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/utils/BootCountUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/utils/BootCountUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/builtintypes/Stopwatch.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/builtintypes/Stopwatch.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/builtintypes/Stopwatch.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/builtintypes/Timer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/builtintypes/Timer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/builtintypes/Timer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/builtintypes/Timer.java"/>
+    </issue>
+
+</issues>
diff --git a/appsearch/appsearch-debug-view/samples/build.gradle b/appsearch/appsearch-debug-view/samples/build.gradle
index 532b284..23cf51f 100644
--- a/appsearch/appsearch-debug-view/samples/build.gradle
+++ b/appsearch/appsearch-debug-view/samples/build.gradle
@@ -44,10 +44,3 @@
     implementation(libs.constraintLayout)
     implementation(libs.guavaAndroid)
 }
-
-androidx {
-    name = "AppSearch Debug View Sample App"
-    type = LibraryType.SAMPLES
-    inceptionYear = "2021"
-    description = "Contains a sample app for integrating the Androidx AppSearch Debug View"
-}
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
index 81bcd40c..4e35b15 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
@@ -1415,7 +1415,7 @@
              *
              * @throws IllegalArgumentException if the provided PropertyConfig sets
              * {@link #shouldIndexNestedProperties()} to true and has one or more properties
-             * defined for {@link #getIndexableNestedProperties()}.
+             * defined using {@link #addIndexableNestedProperties(Collection)}.
              */
             @NonNull
             public DocumentPropertyConfig build() {
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/JoinSpec.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/JoinSpec.java
index 40b0353..3639a79 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/JoinSpec.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/JoinSpec.java
@@ -293,7 +293,7 @@
          * Sets the query and the SearchSpec for the documents being joined. This will score and
          * rank the joined documents as well as filter the joined documents.
          *
-         * <p>If {@link SearchSpec.RankingStrategy#RANKING_STRATEGY_JOIN_AGGREGATE_SCORE} is set in
+         * <p>If {@link SearchSpec#RANKING_STRATEGY_JOIN_AGGREGATE_SCORE} is set in
          * the outer {@link SearchSpec}, the resulting signals will be used to rank the parent
          * documents. Note that the aggregation strategy also needs to be set with
          * {@link JoinSpec.Builder#setAggregationScoringStrategy}, otherwise the default will be
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java
index f9d87c3..9b86fc3 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchSpec.java
@@ -510,21 +510,21 @@
     }
 
     /**
-     * Returns whether the {@link Features#NUMERIC_SEARCH} feature is enabled.
+     * Returns whether the NUMERIC_SEARCH feature is enabled.
      */
     public boolean isNumericSearchEnabled() {
         return getEnabledFeatures().contains(FeatureConstants.NUMERIC_SEARCH);
     }
 
     /**
-     * Returns whether the {@link Features#VERBATIM_SEARCH} feature is enabled.
+     * Returns whether the VERBATIM_SEARCH feature is enabled.
      */
     public boolean isVerbatimSearchEnabled() {
         return getEnabledFeatures().contains(FeatureConstants.VERBATIM_SEARCH);
     }
 
     /**
-     * Returns whether the {@link Features#LIST_FILTER_QUERY_LANGUAGE} feature is enabled.
+     * Returns whether the LIST_FILTER_QUERY_LANGUAGE feature is enabled.
      */
     public boolean isListFilterQueryLanguageEnabled() {
         return getEnabledFeatures().contains(FeatureConstants.LIST_FILTER_QUERY_LANGUAGE);
@@ -1518,8 +1518,7 @@
 // @exportToFramework:endStrip()
 
         /**
-         * Sets the {@link Features#NUMERIC_SEARCH} feature as enabled/disabled according to the
-         * enabled parameter.
+         * Sets the NUMERIC_SEARCH feature as enabled/disabled according to the enabled parameter.
          *
          * @param enabled Enables the feature if true, otherwise disables it.
          *
@@ -1539,8 +1538,7 @@
         }
 
         /**
-         * Sets the {@link Features#VERBATIM_SEARCH} feature as enabled/disabled according to the
-         * enabled parameter.
+         * Sets the VERBATIM_SEARCH feature as enabled/disabled according to the enabled parameter.
          *
          * @param enabled Enables the feature if true, otherwise disables it
          *
@@ -1564,8 +1562,8 @@
         }
 
         /**
-         * Sets the {@link Features#LIST_FILTER_QUERY_LANGUAGE} feature as enabled/disabled
-         * according to the enabled parameter.
+         * Sets the LIST_FILTER_QUERY_LANGUAGE feature as enabled/disabled according to the
+         * enabled parameter.
          *
          * @param enabled Enables the feature if true, otherwise disables it.
          *
diff --git a/arch/core/core-runtime/lint-baseline.xml b/arch/core/core-runtime/lint-baseline.xml
new file mode 100644
index 0000000..50b2d22
--- /dev/null
+++ b/arch/core/core-runtime/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java"/>
+    </issue>
+
+</issues>
diff --git a/autofill/autofill/api/api_lint.ignore b/autofill/autofill/api/api_lint.ignore
index 679a1d3..c963001 100644
--- a/autofill/autofill/api/api_lint.ignore
+++ b/autofill/autofill/api/api_lint.ignore
@@ -1,16 +1,4 @@
 // Baseline format: 1.0
-HiddenSuperclass: androidx.autofill.inline.common.ViewStyle:
-    Public class androidx.autofill.inline.common.ViewStyle stripped of unavailable superclass androidx.autofill.inline.common.BundledStyle
-HiddenSuperclass: androidx.autofill.inline.v1.InlineSuggestionUi.Content:
-    Public class androidx.autofill.inline.v1.InlineSuggestionUi.Content stripped of unavailable superclass androidx.autofill.inline.common.SlicedContent
-HiddenSuperclass: androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder:
-    Public class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder stripped of unavailable superclass androidx.autofill.inline.common.SlicedContent.Builder
-HiddenSuperclass: androidx.autofill.inline.v1.InlineSuggestionUi.Style:
-    Public class androidx.autofill.inline.v1.InlineSuggestionUi.Style stripped of unavailable superclass androidx.autofill.inline.common.BundledStyle
-HiddenSuperclass: androidx.autofill.inline.v1.InlineSuggestionUi.Style.Builder:
-    Public class androidx.autofill.inline.v1.InlineSuggestionUi.Style.Builder stripped of unavailable superclass androidx.autofill.inline.common.BundledStyle.Builder
-
-
 MissingGetterMatchingBuilder: androidx.autofill.inline.UiVersions.StylesBuilder#addStyle(androidx.autofill.inline.UiVersions.Style):
     android.os.Bundle does not declare a `getStyles()` method matching method androidx.autofill.inline.UiVersions.StylesBuilder.addStyle(androidx.autofill.inline.UiVersions.Style)
 MissingGetterMatchingBuilder: androidx.autofill.inline.common.ImageViewStyle.Builder#setBackground(android.graphics.drawable.Icon):
diff --git a/benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/utils/Constants.kt b/benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/utils/Constants.kt
index 220b1d2..77413f1 100644
--- a/benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/utils/Constants.kt
+++ b/benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/utils/Constants.kt
@@ -16,8 +16,8 @@
 
 package androidx.baselineprofile.gradle.utils
 
-internal const val TEST_AGP_VERSION_8_0_0 = "8.0.0-beta03"
-internal const val TEST_AGP_VERSION_8_1_0 = "8.1.0-beta05"
+internal const val TEST_AGP_VERSION_8_0_0 = "8.0.0"
+internal const val TEST_AGP_VERSION_8_1_0 = "8.1.0"
 internal const val TEST_AGP_VERSION_8_2_0 = "8.2.0-alpha04"
 internal val TEST_AGP_VERSION_CURRENT = null
 
diff --git a/benchmark/benchmark-common/lint-baseline.xml b/benchmark/benchmark-common/lint-baseline.xml
index c56433f..21ab699 100644
--- a/benchmark/benchmark-common/lint-baseline.xml
+++ b/benchmark/benchmark-common/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `stopAllPerfettoProcesses`"
+        message="Call requires API level 23 (current min is 19): `stopAllPerfettoProcesses`"
         errorLine1="        PerfettoHelper.stopAllPerfettoProcesses()"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -12,7 +12,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 21 (current min is 14): `getPidsForProcess`"
+        message="Call requires API level 21 (current min is 19): `getPidsForProcess`"
         errorLine1="        fun getPerfettoPids() = Shell.getPidsForProcess(if (unbundled) &quot;tracebox&quot; else &quot;perfetto&quot;)"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~">
         <location
@@ -21,7 +21,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `PerfettoCapture`"
+        message="Call requires API level 23 (current min is 19): `PerfettoCapture`"
         errorLine1="        val capture = PerfettoCapture(unbundled)"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -30,7 +30,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `start`"
+        message="Call requires API level 23 (current min is 19): `start`"
         errorLine1="        capture.start("
         errorLine2="                ~~~~~">
         <location
@@ -39,7 +39,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `isRunning`"
+        message="Call requires API level 23 (current min is 19): `isRunning`"
         errorLine1="        assertTrue(capture.isRunning())"
         errorLine2="                           ~~~~~~~~~">
         <location
@@ -48,7 +48,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `stopAllPerfettoProcesses`"
+        message="Call requires API level 23 (current min is 19): `stopAllPerfettoProcesses`"
         errorLine1="        PerfettoHelper.stopAllPerfettoProcesses()"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -57,7 +57,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `isRunning`"
+        message="Call requires API level 23 (current min is 19): `isRunning`"
         errorLine1="        assertFalse(capture.isRunning())"
         errorLine2="                            ~~~~~~~~~">
         <location
@@ -66,7 +66,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `isAbiSupported`"
+        message="Call requires API level 23 (current min is 19): `isAbiSupported`"
         errorLine1="        Assume.assumeTrue(PerfettoHelper.isAbiSupported())"
         errorLine2="                                         ~~~~~~~~~~~~~~">
         <location
diff --git a/benchmark/benchmark-darwin-samples/build.gradle b/benchmark/benchmark-darwin-samples/build.gradle
index 3684119..ef5f75f 100644
--- a/benchmark/benchmark-darwin-samples/build.gradle
+++ b/benchmark/benchmark-darwin-samples/build.gradle
@@ -1,3 +1,4 @@
+import androidx.build.BuildOnServerKt
 import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode
 import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFrameworkConfig
 
@@ -33,17 +34,20 @@
                 implementation(libs.kotlinTestAnnotationsCommon)
             }
         }
-        iosArm64Main {
+        iosMain {
             dependsOn(commonMain)
             dependencies {
                 api(project(":benchmark:benchmark-darwin"))
             }
         }
+        iosArm64Main {
+            dependsOn(iosMain)
+        }
         iosSimulatorArm64Main {
-            dependsOn(iosArm64Main)
+            dependsOn(iosMain)
         }
         iosX64Main {
-            dependsOn(iosArm64Main)
+            dependsOn(iosMain)
         }
     }
 }
diff --git a/benchmark/benchmark-darwin-samples/src/iosArm64Main/kotlin/androidx/benchmark/darwin/samples/ArrayListAllocationBenchmark.kt b/benchmark/benchmark-darwin-samples/src/iosMain/kotlin/androidx/benchmark/darwin/samples/ArrayListAllocationBenchmark.kt
similarity index 100%
rename from benchmark/benchmark-darwin-samples/src/iosArm64Main/kotlin/androidx/benchmark/darwin/samples/ArrayListAllocationBenchmark.kt
rename to benchmark/benchmark-darwin-samples/src/iosMain/kotlin/androidx/benchmark/darwin/samples/ArrayListAllocationBenchmark.kt
diff --git a/benchmark/benchmark-darwin-samples/src/iosArm64Main/kotlin/androidx/benchmark/darwin/samples/TestCases.kt b/benchmark/benchmark-darwin-samples/src/iosMain/kotlin/androidx/benchmark/darwin/samples/TestCases.kt
similarity index 100%
rename from benchmark/benchmark-darwin-samples/src/iosArm64Main/kotlin/androidx/benchmark/darwin/samples/TestCases.kt
rename to benchmark/benchmark-darwin-samples/src/iosMain/kotlin/androidx/benchmark/darwin/samples/TestCases.kt
diff --git a/benchmark/benchmark-darwin/build.gradle b/benchmark/benchmark-darwin/build.gradle
index 9cb5a0d..1c6e64cc 100644
--- a/benchmark/benchmark-darwin/build.gradle
+++ b/benchmark/benchmark-darwin/build.gradle
@@ -39,17 +39,20 @@
                     implementation(libs.kotlinTestAnnotationsCommon)
                 }
             }
-            iosArm64Main {
+            iosMain {
                 dependsOn(darwinMain)
                 dependencies {
                     api(project(":benchmark:benchmark-darwin-core"))
                 }
             }
+            iosArm64Main {
+                dependsOn(iosMain)
+            }
             iosSimulatorArm64Main {
-                dependsOn(iosArm64Main)
+                dependsOn(iosMain)
             }
             iosX64Main {
-                dependsOn(iosArm64Main)
+                dependsOn(iosMain)
             }
             targets.all { target ->
                 if (target.platformType == KotlinPlatformType.native) {
diff --git a/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/MeasureOptions.kt b/benchmark/benchmark-darwin/src/iosMain/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
similarity index 100%
rename from benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
rename to benchmark/benchmark-darwin/src/iosMain/kotlin/androidx/benchmark/darwin/MeasureOptions.kt
diff --git a/benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/TestCaseContextWrapper.kt b/benchmark/benchmark-darwin/src/iosMain/kotlin/androidx/benchmark/darwin/TestCaseContextWrapper.kt
similarity index 100%
rename from benchmark/benchmark-darwin/src/iosArm64Main/kotlin/androidx/benchmark/darwin/TestCaseContextWrapper.kt
rename to benchmark/benchmark-darwin/src/iosMain/kotlin/androidx/benchmark/darwin/TestCaseContextWrapper.kt
diff --git a/biometric/biometric/lint-baseline.xml b/biometric/biometric/lint-baseline.xml
index 8836527..b7dd64e 100644
--- a/biometric/biometric/lint-baseline.xml
+++ b/biometric/biometric/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="WrongConstant"
@@ -28,4 +28,85 @@
             file="src/main/java/androidx/biometric/BiometricManager.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.KITKAT) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/BiometricFragment.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/CancellationSignalProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="            @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/CancellationSignalProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/CancellationSignalProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/CancellationSignalProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/CancellationSignalProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/FingerprintDialogFragment.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/KeyguardUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/biometric/KeyguardUtils.java"/>
+    </issue>
+
 </issues>
diff --git a/biometric/biometric/src/test/java/androidx/biometric/CancellationSignalProviderTest.java b/biometric/biometric/src/test/java/androidx/biometric/CancellationSignalProviderTest.java
index 69c3f64..ed0441f 100644
--- a/biometric/biometric/src/test/java/androidx/biometric/CancellationSignalProviderTest.java
+++ b/biometric/biometric/src/test/java/androidx/biometric/CancellationSignalProviderTest.java
@@ -22,10 +22,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
-import android.os.Build;
-
 import androidx.annotation.NonNull;
-import androidx.test.filters.SdkSuppress;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -39,7 +36,6 @@
 @RunWith(RobolectricTestRunner.class)
 @Config(instrumentedPackages = { "androidx.core.os" })
 @DoNotInstrument
-@SdkSuppress(minSdkVersion = 16)
 public class CancellationSignalProviderTest {
     @Mock private android.os.CancellationSignal mBiometricCancellationSignal;
     @Mock private androidx.core.os.CancellationSignal mFingerprintCancellationSignal;
@@ -82,7 +78,6 @@
     }
 
     @Test
-    @Config(minSdk = Build.VERSION_CODES.JELLY_BEAN)
     public void testBiometricCancellationSignal_IsCached() {
         final CancellationSignalProvider provider = new CancellationSignalProvider();
         final android.os.CancellationSignal cancellationSignal =
@@ -91,7 +86,6 @@
     }
 
     @Test
-    @Config(minSdk = Build.VERSION_CODES.JELLY_BEAN)
     public void testBiometricCancellationSignal_ReceivesCancel() {
         final CancellationSignalProvider provider =
                 new CancellationSignalProvider(mFieldMockInjector);
@@ -126,7 +120,6 @@
     }
 
     @Test
-    @Config(minSdk = Build.VERSION_CODES.JELLY_BEAN)
     public void testBothCancellationSignals_ReceiveCancel() {
         final CancellationSignalProvider provider =
                 new CancellationSignalProvider(mFieldMockInjector);
diff --git a/biometric/biometric/src/test/java/androidx/biometric/KeyguardUtilsTest.java b/biometric/biometric/src/test/java/androidx/biometric/KeyguardUtilsTest.java
index 087c330..a1744c1 100644
--- a/biometric/biometric/src/test/java/androidx/biometric/KeyguardUtilsTest.java
+++ b/biometric/biometric/src/test/java/androidx/biometric/KeyguardUtilsTest.java
@@ -99,7 +99,7 @@
     }
 
     @Test
-    @Config(minSdk = Build.VERSION_CODES.JELLY_BEAN, maxSdk = Build.VERSION_CODES.LOLLIPOP_MR1)
+    @Config(maxSdk = Build.VERSION_CODES.LOLLIPOP_MR1)
     public void testIsDeviceSecuredWithCredential_CorrectlyReturnsTrue_OnApi16To22() {
         when(mContext.getSystemService(anyString())).thenReturn(mKeyguardManager);
         when(mKeyguardManager.isKeyguardSecure()).thenReturn(true);
diff --git a/biometric/integration-tests/testapp/build.gradle b/biometric/integration-tests/testapp/build.gradle
index f0ebfb6..57c0eed 100755
--- a/biometric/integration-tests/testapp/build.gradle
+++ b/biometric/integration-tests/testapp/build.gradle
@@ -23,8 +23,6 @@
 android {
     defaultConfig {
         applicationId "androidx.biometric.integration.testapp"
-        minSdkVersion 18
-        versionCode 1
         testInstrumentationRunnerArgument "listener", "leakcanary.FailTestOnLeakRunListener"
     }
 
diff --git a/biometric/integration-tests/testapp/lint-baseline.xml b/biometric/integration-tests/testapp/lint-baseline.xml
new file mode 100644
index 0000000..34bc125
--- /dev/null
+++ b/biometric/integration-tests/testapp/lint-baseline.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="NotificationPermission"
+        message="When targeting Android 13 or higher, posting a permission requires holding the `POST_NOTIFICATIONS` permission (usage from leakcanary.NotificationEventListener)">
+        <location
+            file="src/main/AndroidManifest.xml"/>
+    </issue>
+
+</issues>
diff --git a/bluetooth/bluetooth/build.gradle b/bluetooth/bluetooth/build.gradle
index cc619ec..a9fbec1 100644
--- a/bluetooth/bluetooth/build.gradle
+++ b/bluetooth/bluetooth/build.gradle
@@ -47,6 +47,6 @@
 android {
     namespace "androidx.bluetooth"
     defaultConfig {
-        minSdkVersion 32
+        minSdkVersion 31
     }
 }
diff --git a/bluetooth/integration-tests/testapp/build.gradle b/bluetooth/integration-tests/testapp/build.gradle
index 0c47808..682a8e4 100644
--- a/bluetooth/integration-tests/testapp/build.gradle
+++ b/bluetooth/integration-tests/testapp/build.gradle
@@ -24,7 +24,7 @@
 
 android {
     defaultConfig {
-        minSdkVersion 32
+        minSdkVersion 31
         targetSdkVersion 33
         versionCode 1
         versionName "1.0"
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/MainActivity.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/MainActivity.kt
index a2f8213..14512006 100644
--- a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/MainActivity.kt
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/MainActivity.kt
@@ -77,7 +77,7 @@
 
         val navController = findNavController(R.id.nav_host_fragment_activity_main)
         val appBarConfiguration = AppBarConfiguration(
-            setOf(R.id.navigation_scanner, R.id.navigation_advertiser)
+            setOf(R.id.navigation_scanner, R.id.navigation_advertiser, R.id.navigation_gatt_server)
         )
         setupActionBarWithNavController(navController, appBarConfiguration)
         navView.setupWithNavController(navController)
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/AdvertiserFragment.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/AdvertiserFragment.kt
index 1c420fb..7007c06 100644
--- a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/AdvertiserFragment.kt
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/AdvertiserFragment.kt
@@ -26,14 +26,10 @@
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import android.widget.CheckBox
 import android.widget.EditText
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.widget.PopupMenu
 import androidx.bluetooth.BluetoothLe
-import androidx.bluetooth.GattCharacteristic
-import androidx.bluetooth.GattServerRequest
-import androidx.bluetooth.GattService
 import androidx.bluetooth.integration.testapp.R
 import androidx.bluetooth.integration.testapp.databinding.FragmentAdvertiserBinding
 import androidx.bluetooth.integration.testapp.ui.common.getColor
@@ -43,9 +39,6 @@
 import androidx.core.view.isVisible
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
-import androidx.recyclerview.widget.DividerItemDecoration
-import androidx.recyclerview.widget.LinearLayoutManager
-import com.google.android.material.tabs.TabLayout
 import java.util.UUID
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
@@ -56,8 +49,6 @@
 
     private companion object {
         private const val TAG = "AdvertiserFragment"
-
-        private const val TAB_ADVERTISER_POSITION = 0
     }
 
     private lateinit var bluetoothLe: BluetoothLe
@@ -67,9 +58,6 @@
     private val advertiseScope = CoroutineScope(Dispatchers.Main + Job())
     private var advertiseJob: Job? = null
 
-    private val gattServerScope = CoroutineScope(Dispatchers.Main + Job())
-    private var gattServerJob: Job? = null
-
     private var isAdvertising: Boolean = false
         set(value) {
             field = value
@@ -89,41 +77,6 @@
             _binding?.viewRecyclerViewOverlay?.isVisible = value
         }
 
-    private var gattServerServicesAdapter: GattServerServicesAdapter? = null
-
-    private var isGattServerOpen: Boolean = false
-        set(value) {
-            field = value
-            if (value) {
-                _binding?.buttonGattServer?.text = getString(R.string.stop_gatt_server)
-                _binding?.buttonGattServer?.backgroundTintList = getColor(R.color.red_500)
-            } else {
-                _binding?.buttonGattServer?.text = getString(R.string.open_gatt_server)
-                _binding?.buttonGattServer?.backgroundTintList = getColor(R.color.indigo_500)
-                gattServerJob?.cancel()
-                gattServerJob = null
-            }
-        }
-
-    private var showingAdvertiser: Boolean = false
-        set(value) {
-            field = value
-            _binding?.layoutAdvertiser?.isVisible = value
-            _binding?.layoutGattServer?.isVisible = !value
-        }
-
-    private val onTabSelectedListener = object : TabLayout.OnTabSelectedListener {
-        override fun onTabSelected(tab: TabLayout.Tab) {
-            showingAdvertiser = tab.position == TAB_ADVERTISER_POSITION
-        }
-
-        override fun onTabUnselected(tab: TabLayout.Tab) {
-        }
-
-        override fun onTabReselected(tab: TabLayout.Tab) {
-        }
-    }
-
     private val viewModel: AdvertiserViewModel by viewModels()
 
     private var _binding: FragmentAdvertiserBinding? = null
@@ -138,8 +91,6 @@
 
         _binding = FragmentAdvertiserBinding.inflate(inflater, container, false)
 
-        binding.tabLayout.addOnTabSelectedListener(onTabSelectedListener)
-
         binding.checkBoxIncludeDeviceName.setOnCheckedChangeListener { _, isChecked ->
             viewModel.includeDeviceName = isChecked
         }
@@ -180,28 +131,6 @@
             }
         }
 
-        binding.buttonAddService.setOnClickListener {
-            onAddGattService()
-        }
-
-        gattServerServicesAdapter =
-            GattServerServicesAdapter(
-                viewModel.gattServerServices,
-                ::onAddGattCharacteristic
-            )
-        binding.recyclerViewGattServerServices.adapter = gattServerServicesAdapter
-        binding.recyclerViewGattServerServices.addItemDecoration(
-            DividerItemDecoration(context, LinearLayoutManager.VERTICAL)
-        )
-
-        binding.buttonGattServer.setOnClickListener {
-            if (gattServerJob?.isActive == true) {
-                isGattServerOpen = false
-            } else {
-                openGattServer()
-            }
-        }
-
         initData()
 
         return binding.root
@@ -211,7 +140,6 @@
         super.onDestroyView()
         _binding = null
         isAdvertising = false
-        isGattServerOpen = false
     }
 
     private fun initData() {
@@ -356,190 +284,4 @@
             isAdvertising = false
         }
     }
-
-    private fun onAddGattService() {
-        Log.d(TAG, "onAddGattService() called")
-
-        val editTextUuid = EditText(requireActivity())
-        editTextUuid.hint = getString(R.string.service_uuid)
-
-        AlertDialog.Builder(requireContext())
-            .setTitle(getString(R.string.add_service))
-            .setViewEditText(editTextUuid)
-            .setPositiveButton(getString(R.string.add)) { _, _ ->
-                val editTextInput = editTextUuid.text.toString()
-                try {
-                    val uuid = UUID.fromString(
-                        when (editTextInput.length) {
-                            4 -> "0000$editTextInput-0000-1000-8000-00805F9B34FB"
-                            8 -> "$editTextInput-0000-1000-8000-00805F9B34FB"
-                            else -> editTextInput
-                        }
-                    )
-                    val service = GattService(uuid, listOf())
-                    viewModel.addGattService(service)
-                    gattServerServicesAdapter
-                        ?.notifyItemInserted(viewModel.gattServerServices.size - 1)
-                } catch (e: Exception) {
-                    Log.d(TAG, e.toString())
-                    toast(getString(R.string.invalid_uuid)).show()
-                }
-            }
-            .setNegativeButton(getString(R.string.cancel), null)
-            .create()
-            .show()
-    }
-
-    private fun onAddGattCharacteristic(bluetoothGattService: GattService) {
-        Log.d(
-            TAG, "onAddGattCharacteristic() called with: " +
-                "bluetoothGattService = $bluetoothGattService"
-        )
-
-        val view = layoutInflater.inflate(R.layout.dialog_add_characteristic, null)
-        val editTextUuid = view.findViewById<EditText>(R.id.edit_text_uuid)
-
-        val checkBoxPropertiesBroadcast =
-            view.findViewById<CheckBox>(R.id.check_box_properties_broadcast)
-        val checkBoxPropertiesIndicate =
-            view.findViewById<CheckBox>(R.id.check_box_properties_indicate)
-        val checkBoxPropertiesNotify = view.findViewById<CheckBox>(R.id.check_box_properties_notify)
-        val checkBoxPropertiesRead = view.findViewById<CheckBox>(R.id.check_box_properties_read)
-        val checkBoxPropertiesSignedWrite =
-            view.findViewById<CheckBox>(R.id.check_box_properties_signed_write)
-        val checkBoxPropertiesWrite = view.findViewById<CheckBox>(R.id.check_box_properties_write)
-        val checkBoxPropertiesWriteNoResponse =
-            view.findViewById<CheckBox>(R.id.check_box_properties_write_no_response)
-
-        AlertDialog.Builder(requireContext())
-            .setTitle(getString(R.string.add_characteristic))
-            .setView(view)
-            .setPositiveButton(getString(R.string.add)) { _, _ ->
-                val uuidText = editTextUuid.text.toString()
-
-                var properties = 0
-                if (checkBoxPropertiesBroadcast.isChecked) {
-                    properties = properties or GattCharacteristic.PROPERTY_BROADCAST
-                }
-                if (checkBoxPropertiesIndicate.isChecked) {
-                    properties = properties or GattCharacteristic.PROPERTY_INDICATE
-                }
-                if (checkBoxPropertiesNotify.isChecked) {
-                    properties = properties or GattCharacteristic.PROPERTY_NOTIFY
-                }
-                if (checkBoxPropertiesRead.isChecked) {
-                    properties = properties or GattCharacteristic.PROPERTY_READ
-                }
-                if (checkBoxPropertiesSignedWrite.isChecked) {
-                    properties = properties or GattCharacteristic.PROPERTY_SIGNED_WRITE
-                }
-                if (checkBoxPropertiesWrite.isChecked) {
-                    properties = properties or GattCharacteristic.PROPERTY_WRITE
-                }
-                if (checkBoxPropertiesWriteNoResponse.isChecked) {
-                    properties = properties or GattCharacteristic.PROPERTY_WRITE_NO_RESPONSE
-                }
-
-                try {
-                    val uuid = UUID.fromString(
-                        when (uuidText.length) {
-                            4 -> "0000$uuidText-0000-1000-8000-00805F9B34FB"
-                            8 -> "$uuidText-0000-1000-8000-00805F9B34FB"
-                            else -> uuidText
-                        }
-                    )
-                    val sampleCharacteristic = GattCharacteristic(uuid, properties)
-
-                    val index = viewModel.gattServerServices.indexOf(bluetoothGattService)
-                    viewModel.addGattCharacteristic(bluetoothGattService, sampleCharacteristic)
-
-                    gattServerServicesAdapter?.notifyItemChanged(index)
-                } catch (e: Exception) {
-                    toast(getString(R.string.invalid_uuid)).show()
-                }
-            }
-            .setNegativeButton(getString(R.string.cancel), null)
-            .create()
-            .show()
-    }
-
-    private fun openGattServer() {
-        Log.d(TAG, "openGattServer() called")
-
-        gattServerJob = gattServerScope.launch {
-            Log.d(
-                TAG, "bluetoothLe.openGattServer() called with: " +
-                    "viewModel.gattServerServices = ${viewModel.gattServerServices}"
-            )
-
-            isGattServerOpen = true
-
-            bluetoothLe.openGattServer(viewModel.gattServerServices) {
-                Log.d(
-                    TAG, "bluetoothLe.openGattServer() called with: " +
-                        "viewModel.gattServerServices = ${viewModel.gattServerServices}"
-                )
-
-                connectRequests.collect {
-                    Log.d(TAG, "connectRequests.collected: GattServerConnectRequest = $it")
-
-                    launch {
-                        it.accept {
-                            Log.d(
-                                TAG, "GattServerConnectRequest accepted: " +
-                                    "GattServerSessionScope = $it"
-                            )
-
-                            requests.collect { gattServerRequest ->
-                                Log.d(
-                                    TAG, "requests collected: " +
-                                        "gattServerRequest = $gattServerRequest"
-                                )
-
-                                // TODO(b/269390098): Handle requests correctly
-                                when (gattServerRequest) {
-                                    is GattServerRequest.ReadCharacteristic -> {
-                                        val characteristic = gattServerRequest.characteristic
-
-                                        val value = viewModel.readGattCharacteristicValue(
-                                            characteristic
-                                        )
-
-                                        toast(
-                                            "Read value: ${value.decodeToString()} " +
-                                                "for characteristic = ${characteristic.uuid}"
-                                        ).show()
-
-                                        gattServerRequest.sendResponse(value)
-                                    }
-
-                                    is GattServerRequest.WriteCharacteristics -> {
-                                        val characteristic =
-                                            gattServerRequest.parts[0].characteristic
-                                        val value = gattServerRequest.parts[0].value
-
-                                        toast(
-                                            "Writing value: ${value.decodeToString()} " +
-                                                "to characteristic = ${characteristic.uuid}"
-                                        ).show()
-
-                                        viewModel.updateGattCharacteristicValue(
-                                            characteristic,
-                                            value
-                                        )
-
-                                        gattServerRequest.sendResponse()
-                                    }
-
-                                    else -> {
-                                        throw NotImplementedError("Unknown request")
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
 }
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/AdvertiserViewModel.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/AdvertiserViewModel.kt
index 6ffb169..0d34f33 100644
--- a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/AdvertiserViewModel.kt
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/AdvertiserViewModel.kt
@@ -17,8 +17,6 @@
 package androidx.bluetooth.integration.testapp.ui.advertiser
 
 import androidx.bluetooth.AdvertiseParams
-import androidx.bluetooth.GattCharacteristic
-import androidx.bluetooth.GattService
 import androidx.lifecycle.ViewModel
 import java.util.UUID
 
@@ -62,12 +60,6 @@
             serviceUuids
         )
 
-    private val _gattServerServices = mutableListOf<GattService>()
-    val gattServerServices: List<GattService> = _gattServerServices
-
-    private val gattServerServicesCharacteristicValueMap =
-        mutableMapOf<GattCharacteristic, ByteArray>()
-
     fun removeAdvertiseDataAtIndex(index: Int) {
         val manufacturerDataSize = manufacturerDatas.size
         val serviceDataSize = serviceDatas.size
@@ -80,26 +72,4 @@
             serviceUuids.removeAt(index - manufacturerDataSize - serviceDataSize)
         }
     }
-
-    fun addGattService(gattService: GattService) {
-        _gattServerServices.add(gattService)
-    }
-
-    fun addGattCharacteristic(service: GattService, characteristic: GattCharacteristic) {
-        val index = _gattServerServices.indexOf(service)
-        if (index < 0) return
-        _gattServerServices[index] = GattService(service.uuid,
-            service.characteristics.toMutableList().apply {
-                add(characteristic)
-            }
-        )
-    }
-
-    fun readGattCharacteristicValue(characteristic: GattCharacteristic): ByteArray {
-        return gattServerServicesCharacteristicValueMap[characteristic] ?: ByteArray(0)
-    }
-
-    fun updateGattCharacteristicValue(characteristic: GattCharacteristic, value: ByteArray) {
-        gattServerServicesCharacteristicValueMap[characteristic] = value
-    }
 }
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/GattServerCharacteristicsAdapter.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/GattServerCharacteristicsAdapter.kt
deleted file mode 100644
index 9d9f2ba..0000000
--- a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/GattServerCharacteristicsAdapter.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.bluetooth.integration.testapp.ui.advertiser
-
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.bluetooth.GattCharacteristic
-import androidx.bluetooth.integration.testapp.R
-import androidx.recyclerview.widget.RecyclerView
-
-class GattServerCharacteristicsAdapter(
-    private val characteristics: List<GattCharacteristic>
-) : RecyclerView.Adapter<GattServerCharacteristicsAdapter.ViewHolder>() {
-
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_gatt_server_characteristic, parent, false)
-        return ViewHolder(view)
-    }
-
-    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
-        holder.bind(characteristics[position])
-    }
-
-    override fun getItemCount(): Int {
-        return characteristics.size
-    }
-
-    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-
-        private val textViewUuid: TextView = itemView.findViewById(R.id.text_view_uuid)
-        private val textViewProperties: TextView = itemView.findViewById(R.id.text_view_properties)
-
-        fun bind(characteristic: GattCharacteristic) {
-            textViewUuid.text = characteristic.uuid.toString()
-
-            val properties = characteristic.properties
-            val context = itemView.context
-            val propertiesList = mutableListOf<String>()
-
-            if (properties.and(GattCharacteristic.PROPERTY_BROADCAST) != 0) {
-                propertiesList.add(context.getString(R.string.broadcast))
-            }
-            if (properties.and(GattCharacteristic.PROPERTY_INDICATE) != 0) {
-                propertiesList.add(context.getString(R.string.indicate))
-            }
-            if (properties.and(GattCharacteristic.PROPERTY_NOTIFY) != 0) {
-                propertiesList.add(context.getString(R.string.notify))
-            }
-            if (properties.and(GattCharacteristic.PROPERTY_READ) != 0) {
-                propertiesList.add(context.getString(R.string.read))
-            }
-            if (properties.and(GattCharacteristic.PROPERTY_SIGNED_WRITE) != 0) {
-                propertiesList.add(context.getString(R.string.signed_write))
-            }
-            if (properties.and(GattCharacteristic.PROPERTY_WRITE) != 0) {
-                propertiesList.add(context.getString(R.string.write))
-            }
-            if (properties.and(GattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) != 0) {
-                propertiesList.add(context.getString(R.string.write_no_response))
-            }
-            textViewProperties.text = propertiesList.joinToString()
-        }
-    }
-}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/GattServerServicesAdapter.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/GattServerServicesAdapter.kt
deleted file mode 100644
index 26d662d..0000000
--- a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/advertiser/GattServerServicesAdapter.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.bluetooth.integration.testapp.ui.advertiser
-
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import android.widget.TextView
-import androidx.bluetooth.GattService
-import androidx.bluetooth.integration.testapp.R
-import androidx.recyclerview.widget.RecyclerView
-
-class GattServerServicesAdapter(
-    private val services: List<GattService>,
-    private val onClickAddCharacteristic: (GattService) -> Unit
-) : RecyclerView.Adapter<GattServerServicesAdapter.ViewHolder>() {
-
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_gatt_server_service, parent, false)
-        return ViewHolder(view)
-    }
-
-    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
-        holder.bind(services[position])
-    }
-
-    override fun getItemCount(): Int {
-        return services.size
-    }
-
-    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-
-        private val textViewUuid: TextView = itemView.findViewById(R.id.text_view_uuid)
-        private val buttonAddCharacteristic: Button =
-            itemView.findViewById(R.id.button_add_characteristic)
-
-        private val recyclerViewServiceCharacteristic: RecyclerView =
-            itemView.findViewById(R.id.recycler_view_service_characteristic)
-
-        private var currentGattService: GattService? = null
-
-        init {
-            buttonAddCharacteristic.setOnClickListener {
-                currentGattService?.let(onClickAddCharacteristic)
-            }
-        }
-
-        fun bind(gattService: GattService) {
-            currentGattService = gattService
-
-            textViewUuid.text = gattService.uuid.toString()
-
-            recyclerViewServiceCharacteristic.adapter = GattServerCharacteristicsAdapter(
-                gattService.characteristics
-            )
-        }
-    }
-}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerCharacteristicsAdapter.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerCharacteristicsAdapter.kt
new file mode 100644
index 0000000..4a99550
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerCharacteristicsAdapter.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.bluetooth.integration.testapp.ui.gatt_server
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.bluetooth.GattCharacteristic
+import androidx.bluetooth.integration.testapp.R
+import androidx.recyclerview.widget.RecyclerView
+
+class GattServerCharacteristicsAdapter(
+    private val characteristics: List<GattCharacteristic>
+) : RecyclerView.Adapter<GattServerCharacteristicsAdapter.ViewHolder>() {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_gatt_server_characteristic, parent, false)
+        return ViewHolder(view)
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        holder.bind(characteristics[position])
+    }
+
+    override fun getItemCount(): Int {
+        return characteristics.size
+    }
+
+    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+
+        private val textViewUuid: TextView = itemView.findViewById(R.id.text_view_uuid)
+        private val textViewProperties: TextView = itemView.findViewById(R.id.text_view_properties)
+
+        fun bind(characteristic: GattCharacteristic) {
+            textViewUuid.text = characteristic.uuid.toString()
+
+            val properties = characteristic.properties
+            val context = itemView.context
+            val propertiesList = mutableListOf<String>()
+
+            if (properties.and(GattCharacteristic.PROPERTY_BROADCAST) != 0) {
+                propertiesList.add(context.getString(R.string.broadcast))
+            }
+            if (properties.and(GattCharacteristic.PROPERTY_INDICATE) != 0) {
+                propertiesList.add(context.getString(R.string.indicate))
+            }
+            if (properties.and(GattCharacteristic.PROPERTY_NOTIFY) != 0) {
+                propertiesList.add(context.getString(R.string.notify))
+            }
+            if (properties.and(GattCharacteristic.PROPERTY_READ) != 0) {
+                propertiesList.add(context.getString(R.string.read))
+            }
+            if (properties.and(GattCharacteristic.PROPERTY_SIGNED_WRITE) != 0) {
+                propertiesList.add(context.getString(R.string.signed_write))
+            }
+            if (properties.and(GattCharacteristic.PROPERTY_WRITE) != 0) {
+                propertiesList.add(context.getString(R.string.write))
+            }
+            if (properties.and(GattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) != 0) {
+                propertiesList.add(context.getString(R.string.write_no_response))
+            }
+            textViewProperties.text = propertiesList.joinToString()
+        }
+    }
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerFragment.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerFragment.kt
new file mode 100644
index 0000000..90844b3
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerFragment.kt
@@ -0,0 +1,309 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.bluetooth.integration.testapp.ui.gatt_server
+
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.CheckBox
+import android.widget.EditText
+import androidx.appcompat.app.AlertDialog
+import androidx.bluetooth.BluetoothLe
+import androidx.bluetooth.GattCharacteristic
+import androidx.bluetooth.GattServerRequest
+import androidx.bluetooth.GattService
+import androidx.bluetooth.integration.testapp.R
+import androidx.bluetooth.integration.testapp.databinding.FragmentGattServerBinding
+import androidx.bluetooth.integration.testapp.ui.common.getColor
+import androidx.bluetooth.integration.testapp.ui.common.setViewEditText
+import androidx.bluetooth.integration.testapp.ui.common.toast
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.DividerItemDecoration
+import androidx.recyclerview.widget.LinearLayoutManager
+import java.util.UUID
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+
+class GattServerFragment : Fragment() {
+
+    private companion object {
+        private const val TAG = "GattServerFragment"
+    }
+
+    private lateinit var bluetoothLe: BluetoothLe
+
+    private val gattServerScope = CoroutineScope(Dispatchers.Main + Job())
+    private var gattServerJob: Job? = null
+
+    private var gattServerServicesAdapter: GattServerServicesAdapter? = null
+
+    private var isGattServerOpen: Boolean = false
+        set(value) {
+            field = value
+            if (value) {
+                _binding?.buttonGattServer?.text = getString(R.string.stop_gatt_server)
+                _binding?.buttonGattServer?.backgroundTintList = getColor(R.color.red_500)
+            } else {
+                _binding?.buttonGattServer?.text = getString(R.string.open_gatt_server)
+                _binding?.buttonGattServer?.backgroundTintList = getColor(R.color.indigo_500)
+                gattServerJob?.cancel()
+                gattServerJob = null
+            }
+        }
+
+    private val viewModel: GattServerViewModel by viewModels()
+
+    private var _binding: FragmentGattServerBinding? = null
+    private val binding get() = _binding!!
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View {
+        bluetoothLe = BluetoothLe(requireContext())
+
+        _binding = FragmentGattServerBinding.inflate(inflater, container, false)
+
+        binding.buttonAddService.setOnClickListener {
+            onAddGattService()
+        }
+
+        gattServerServicesAdapter =
+            GattServerServicesAdapter(
+                viewModel.gattServerServices,
+                ::onAddGattCharacteristic
+            )
+        binding.recyclerViewGattServerServices.adapter = gattServerServicesAdapter
+        binding.recyclerViewGattServerServices.addItemDecoration(
+            DividerItemDecoration(context, LinearLayoutManager.VERTICAL)
+        )
+
+        binding.buttonGattServer.setOnClickListener {
+            if (gattServerJob?.isActive == true) {
+                isGattServerOpen = false
+            } else {
+                openGattServer()
+            }
+        }
+
+        return binding.root
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+        isGattServerOpen = false
+    }
+
+    private fun onAddGattService() {
+        Log.d(TAG, "onAddGattService() called")
+
+        val editTextUuid = EditText(requireActivity())
+        editTextUuid.hint = getString(R.string.service_uuid)
+
+        // TODO(ofy) Delete the following line
+        editTextUuid.setText(UUID.randomUUID().toString())
+
+        AlertDialog.Builder(requireContext())
+            .setTitle(getString(R.string.add_service))
+            .setViewEditText(editTextUuid)
+            .setPositiveButton(getString(R.string.add)) { _, _ ->
+                val editTextInput = editTextUuid.text.toString()
+                try {
+                    val uuid = UUID.fromString(
+                        when (editTextInput.length) {
+                            4 -> "0000$editTextInput-0000-1000-8000-00805F9B34FB"
+                            8 -> "$editTextInput-0000-1000-8000-00805F9B34FB"
+                            else -> editTextInput
+                        }
+                    )
+                    val service = GattService(uuid, listOf())
+                    viewModel.addGattService(service)
+                    gattServerServicesAdapter
+                        ?.notifyItemInserted(viewModel.gattServerServices.size - 1)
+                } catch (e: Exception) {
+                    Log.d(TAG, e.toString())
+                    toast(getString(R.string.invalid_uuid)).show()
+                }
+            }
+            .setNegativeButton(getString(R.string.cancel), null)
+            .create()
+            .show()
+    }
+
+    private fun onAddGattCharacteristic(bluetoothGattService: GattService) {
+        Log.d(
+            TAG, "onAddGattCharacteristic() called with: " +
+                "bluetoothGattService = $bluetoothGattService"
+        )
+
+        val view = layoutInflater.inflate(R.layout.dialog_add_characteristic, null)
+        val editTextUuid = view.findViewById<EditText>(R.id.edit_text_uuid)
+
+        // TODO(ofy) Delete the following line
+        editTextUuid.setText(UUID.randomUUID().toString())
+
+        val checkBoxPropertiesBroadcast =
+            view.findViewById<CheckBox>(R.id.check_box_properties_broadcast)
+        val checkBoxPropertiesIndicate =
+            view.findViewById<CheckBox>(R.id.check_box_properties_indicate)
+        val checkBoxPropertiesNotify = view.findViewById<CheckBox>(R.id.check_box_properties_notify)
+        val checkBoxPropertiesRead = view.findViewById<CheckBox>(R.id.check_box_properties_read)
+        val checkBoxPropertiesSignedWrite =
+            view.findViewById<CheckBox>(R.id.check_box_properties_signed_write)
+        val checkBoxPropertiesWrite = view.findViewById<CheckBox>(R.id.check_box_properties_write)
+        val checkBoxPropertiesWriteNoResponse =
+            view.findViewById<CheckBox>(R.id.check_box_properties_write_no_response)
+
+        AlertDialog.Builder(requireContext())
+            .setTitle(getString(R.string.add_characteristic))
+            .setView(view)
+            .setPositiveButton(getString(R.string.add)) { _, _ ->
+                val uuidText = editTextUuid.text.toString()
+
+                var properties = 0
+                if (checkBoxPropertiesBroadcast.isChecked) {
+                    properties = properties or GattCharacteristic.PROPERTY_BROADCAST
+                }
+                if (checkBoxPropertiesIndicate.isChecked) {
+                    properties = properties or GattCharacteristic.PROPERTY_INDICATE
+                }
+                if (checkBoxPropertiesNotify.isChecked) {
+                    properties = properties or GattCharacteristic.PROPERTY_NOTIFY
+                }
+                if (checkBoxPropertiesRead.isChecked) {
+                    properties = properties or GattCharacteristic.PROPERTY_READ
+                }
+                if (checkBoxPropertiesSignedWrite.isChecked) {
+                    properties = properties or GattCharacteristic.PROPERTY_SIGNED_WRITE
+                }
+                if (checkBoxPropertiesWrite.isChecked) {
+                    properties = properties or GattCharacteristic.PROPERTY_WRITE
+                }
+                if (checkBoxPropertiesWriteNoResponse.isChecked) {
+                    properties = properties or GattCharacteristic.PROPERTY_WRITE_NO_RESPONSE
+                }
+
+                try {
+                    val uuid = UUID.fromString(
+                        when (uuidText.length) {
+                            4 -> "0000$uuidText-0000-1000-8000-00805F9B34FB"
+                            8 -> "$uuidText-0000-1000-8000-00805F9B34FB"
+                            else -> uuidText
+                        }
+                    )
+                    val sampleCharacteristic = GattCharacteristic(uuid, properties)
+
+                    val index = viewModel.gattServerServices.indexOf(bluetoothGattService)
+                    viewModel.addGattCharacteristic(bluetoothGattService, sampleCharacteristic)
+
+                    gattServerServicesAdapter?.notifyItemChanged(index)
+                } catch (e: Exception) {
+                    toast(getString(R.string.invalid_uuid)).show()
+                }
+            }
+            .setNegativeButton(getString(R.string.cancel), null)
+            .create()
+            .show()
+    }
+
+    private fun openGattServer() {
+        Log.d(TAG, "openGattServer() called")
+
+        gattServerJob = gattServerScope.launch {
+            Log.d(
+                TAG, "bluetoothLe.openGattServer() called with: " +
+                    "viewModel.gattServerServices = ${viewModel.gattServerServices}"
+            )
+
+            isGattServerOpen = true
+
+            bluetoothLe.openGattServer(viewModel.gattServerServices) {
+                Log.d(
+                    TAG, "bluetoothLe.openGattServer() called with: " +
+                        "viewModel.gattServerServices = ${viewModel.gattServerServices}"
+                )
+
+                connectRequests.collect {
+                    Log.d(TAG, "connectRequests.collected: GattServerConnectRequest = $it")
+
+                    launch {
+                        it.accept {
+                            Log.d(
+                                TAG, "GattServerConnectRequest accepted: " +
+                                    "GattServerSessionScope = $it"
+                            )
+
+                            requests.collect { gattServerRequest ->
+                                Log.d(
+                                    TAG, "requests collected: " +
+                                        "gattServerRequest = $gattServerRequest"
+                                )
+
+                                // TODO(b/269390098): Handle requests correctly
+                                when (gattServerRequest) {
+                                    is GattServerRequest.ReadCharacteristic -> {
+                                        val characteristic = gattServerRequest.characteristic
+
+                                        val value = viewModel.readGattCharacteristicValue(
+                                            characteristic
+                                        )
+
+                                        toast(
+                                            "Read value: ${value.decodeToString()} " +
+                                                "for characteristic = ${characteristic.uuid}"
+                                        ).show()
+
+                                        gattServerRequest.sendResponse(value)
+                                    }
+
+                                    is GattServerRequest.WriteCharacteristics -> {
+                                        val characteristic =
+                                            gattServerRequest.parts[0].characteristic
+                                        val value = gattServerRequest.parts[0].value
+
+                                        toast(
+                                            "Writing value: ${value.decodeToString()} " +
+                                                "to characteristic = ${characteristic.uuid}"
+                                        ).show()
+
+                                        viewModel.updateGattCharacteristicValue(
+                                            characteristic,
+                                            value
+                                        )
+
+                                        gattServerRequest.sendResponse()
+                                    }
+
+                                    else -> {
+                                        throw NotImplementedError("Unknown request")
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerServicesAdapter.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerServicesAdapter.kt
new file mode 100644
index 0000000..9d8ed54
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerServicesAdapter.kt
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.bluetooth.integration.testapp.ui.gatt_server
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.TextView
+import androidx.bluetooth.GattService
+import androidx.bluetooth.integration.testapp.R
+import androidx.recyclerview.widget.RecyclerView
+
+class GattServerServicesAdapter(
+    private val services: List<GattService>,
+    private val onClickAddCharacteristic: (GattService) -> Unit
+) : RecyclerView.Adapter<GattServerServicesAdapter.ViewHolder>() {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_gatt_server_service, parent, false)
+        return ViewHolder(view)
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        holder.bind(services[position])
+    }
+
+    override fun getItemCount(): Int {
+        return services.size
+    }
+
+    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+
+        private val textViewUuid: TextView = itemView.findViewById(R.id.text_view_uuid)
+        private val buttonAddCharacteristic: Button =
+            itemView.findViewById(R.id.button_add_characteristic)
+
+        private val recyclerViewServiceCharacteristic: RecyclerView =
+            itemView.findViewById(R.id.recycler_view_service_characteristic)
+
+        private var currentGattService: GattService? = null
+
+        init {
+            buttonAddCharacteristic.setOnClickListener {
+                currentGattService?.let(onClickAddCharacteristic)
+            }
+        }
+
+        fun bind(gattService: GattService) {
+            currentGattService = gattService
+
+            textViewUuid.text = gattService.uuid.toString()
+
+            recyclerViewServiceCharacteristic.adapter = GattServerCharacteristicsAdapter(
+                gattService.characteristics
+            )
+        }
+    }
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerViewModel.kt b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerViewModel.kt
new file mode 100644
index 0000000..35e1e67
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/java/androidx/bluetooth/integration/testapp/ui/gatt_server/GattServerViewModel.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.bluetooth.integration.testapp.ui.gatt_server
+
+import androidx.bluetooth.GattCharacteristic
+import androidx.bluetooth.GattService
+import androidx.lifecycle.ViewModel
+
+class GattServerViewModel : ViewModel() {
+
+    private companion object {
+        private const val TAG = "GattServerViewModel"
+    }
+
+    private val _gattServerServices = mutableListOf<GattService>()
+    val gattServerServices: List<GattService> = _gattServerServices
+
+    private val gattServerServicesCharacteristicValueMap =
+        mutableMapOf<GattCharacteristic, ByteArray>()
+
+    fun addGattService(gattService: GattService) {
+        _gattServerServices.add(gattService)
+    }
+
+    fun addGattCharacteristic(service: GattService, characteristic: GattCharacteristic) {
+        val index = _gattServerServices.indexOf(service)
+        if (index < 0) return
+        _gattServerServices[index] = GattService(service.uuid,
+            service.characteristics.toMutableList().apply {
+                add(characteristic)
+            }
+        )
+    }
+
+    fun readGattCharacteristicValue(characteristic: GattCharacteristic): ByteArray {
+        return gattServerServicesCharacteristicValueMap[characteristic] ?: ByteArray(0)
+    }
+
+    fun updateGattCharacteristicValue(characteristic: GattCharacteristic, value: ByteArray) {
+        gattServerServicesCharacteristicValueMap[characteristic] = value
+    }
+}
diff --git a/bluetooth/integration-tests/testapp/src/main/res/drawable/baseline_design_services_24.xml b/bluetooth/integration-tests/testapp/src/main/res/drawable/baseline_design_services_24.xml
new file mode 100644
index 0000000..d3ca206
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/res/drawable/baseline_design_services_24.xml
@@ -0,0 +1,6 @@
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M16.24,11.51l1.57,-1.57l-3.75,-3.75l-1.57,1.57L8.35,3.63c-0.78,-0.78 -2.05,-0.78 -2.83,0l-1.9,1.9c-0.78,0.78 -0.78,2.05 0,2.83l4.13,4.13L3,17.25V21h3.75l4.76,-4.76l4.13,4.13c0.95,0.95 2.23,0.6 2.83,0l1.9,-1.9c0.78,-0.78 0.78,-2.05 0,-2.83L16.24,11.51zM9.18,11.07L5.04,6.94l1.89,-1.9c0,0 0,0 0,0l1.27,1.27L7.02,7.5l1.41,1.41l1.19,-1.19l1.45,1.45L9.18,11.07zM17.06,18.96l-4.13,-4.13l1.9,-1.9l1.45,1.45l-1.19,1.19l1.41,1.41l1.19,-1.19l1.27,1.27L17.06,18.96z"/>
+    <path android:fillColor="@android:color/white" android:pathData="M20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.47,-0.47 -1.12,-0.29 -1.41,0l-1.83,1.83l3.75,3.75L20.71,7.04z"/>
+</vector>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_advertiser.xml b/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_advertiser.xml
index 4181f87..854e454 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_advertiser.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_advertiser.xml
@@ -21,189 +21,109 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <com.google.android.material.tabs.TabLayout
-        android:id="@+id/tab_layout"
+    <TextView
+        android:id="@+id/text_view_configure_advertising_packet"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="16dp"
+        android:text="@string/configure_advertising_packet"
+        android:textColor="@color/black"
+        android:textSize="21sp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <com.google.android.material.textfield.TextInputLayout
+        android:id="@+id/text_input_layout_display_name"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:layout_constraintTop_toTopOf="parent"
-        app:tabMode="fixed">
+        android:hint="@string/display_name"
+        app:layout_constraintTop_toBottomOf="@+id/text_view_configure_advertising_packet">
 
-        <com.google.android.material.tabs.TabItem
-            android:layout_width="wrap_content"
+        <com.google.android.material.textfield.TextInputEditText
+            android:id="@+id/text_input_edit_text_display_name"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="@string/title_advertiser" />
+            android:enabled="false"
+            android:inputType="text"
+            android:maxLines="1" />
 
-        <com.google.android.material.tabs.TabItem
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="@string/gatt_server" />
+    </com.google.android.material.textfield.TextInputLayout>
 
-    </com.google.android.material.tabs.TabLayout>
+    <CheckBox
+        android:id="@+id/check_box_include_device_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="8dp"
+        android:text="@string/include_device_name"
+        app:layout_constraintTop_toBottomOf="@+id/text_input_layout_display_name" />
 
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/layout_advertiser"
+    <CheckBox
+        android:id="@+id/check_box_connectable"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:text="@string/connectable"
+        app:layout_constraintTop_toBottomOf="@+id/check_box_include_device_name" />
+
+    <CheckBox
+        android:id="@+id/check_box_discoverable"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:text="@string/discoverable"
+        app:layout_constraintTop_toBottomOf="@+id/check_box_connectable" />
+
+    <TextView
+        android:id="@+id/text_view_advertising_data"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:layout_marginEnd="8dp"
+        android:padding="8dp"
+        android:text="@string/advertising_data"
+        android:textColor="@color/black"
+        android:textSize="21sp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/check_box_discoverable" />
+
+    <Button
+        android:id="@+id/button_add_data"
+        style="@style/Widget.MaterialComponents.Button.Icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="8dp"
+        android:text="@string/add_data"
+        app:icon="@drawable/baseline_add_24"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/text_view_advertising_data" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_view_advertise_data"
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        app:layoutManager="LinearLayoutManager"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tab_layout"
-        tools:visibility="gone">
+        app:layout_constraintTop_toBottomOf="@+id/button_add_data"
+        tools:itemCount="3"
+        tools:listitem="@layout/item_advertiser_data" />
 
-        <TextView
-            android:id="@+id/text_view_configure_advertising_packet"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:padding="16dp"
-            android:text="@string/configure_advertising_packet"
-            android:textColor="@color/black"
-            android:textSize="21sp"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <com.google.android.material.textfield.TextInputLayout
-            android:id="@+id/text_input_layout_display_name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:hint="@string/display_name"
-            app:layout_constraintTop_toBottomOf="@+id/text_view_configure_advertising_packet">
-
-            <com.google.android.material.textfield.TextInputEditText
-                android:id="@+id/text_input_edit_text_display_name"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:enabled="false"
-                android:inputType="text"
-                android:maxLines="1" />
-
-        </com.google.android.material.textfield.TextInputLayout>
-
-        <CheckBox
-            android:id="@+id/check_box_include_device_name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:layout_marginTop="8dp"
-            android:text="@string/include_device_name"
-            app:layout_constraintTop_toBottomOf="@+id/text_input_layout_display_name" />
-
-        <CheckBox
-            android:id="@+id/check_box_connectable"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:text="@string/connectable"
-            app:layout_constraintTop_toBottomOf="@+id/check_box_include_device_name" />
-
-        <CheckBox
-            android:id="@+id/check_box_discoverable"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:text="@string/discoverable"
-            app:layout_constraintTop_toBottomOf="@+id/check_box_connectable" />
-
-        <TextView
-            android:id="@+id/text_view_advertising_data"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:layout_marginEnd="8dp"
-            android:padding="8dp"
-            android:text="@string/advertising_data"
-            android:textColor="@color/black"
-            android:textSize="21sp"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/check_box_discoverable" />
-
-        <Button
-            android:id="@+id/button_add_data"
-            style="@style/Widget.MaterialComponents.Button.Icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:text="@string/add_data"
-            app:icon="@drawable/baseline_add_24"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/text_view_advertising_data" />
-
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/recycler_view_advertise_data"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            app:layoutManager="LinearLayoutManager"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/button_add_data"
-            tools:itemCount="3"
-            tools:listitem="@layout/item_advertiser_data" />
-
-        <View
-            android:id="@+id/view_recycler_view_overlay"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:clickable="true"
-            android:visibility="gone"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/button_add_data" />
-
-        <Button
-            android:id="@+id/button_advertise"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="16dp"
-            android:text="@string/start_advertising"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent" />
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/layout_gatt_server"
+    <View
+        android:id="@+id/view_recycler_view_overlay"
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        android:clickable="true"
         android:visibility="gone"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tab_layout"
-        tools:visibility="visible">
+        app:layout_constraintTop_toBottomOf="@+id/button_add_data" />
 
-        <androidx.core.widget.NestedScrollView
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            app:layout_constraintTop_toBottomOf="parent"
-            app:layout_constraintTop_toTopOf="parent">
-
-            <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical">
-
-                <androidx.recyclerview.widget.RecyclerView
-                    android:id="@+id/recycler_view_gatt_server_services"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    app:layoutManager="LinearLayoutManager"
-                    tools:itemCount="1"
-                    tools:listitem="@layout/item_gatt_server_service" />
-
-                <Button
-                    android:id="@+id/button_add_service"
-                    style="@style/Widget.MaterialComponents.Button.TextButton"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_margin="16dp"
-                    android:text="@string/add_service" />
-
-            </LinearLayout>
-
-        </androidx.core.widget.NestedScrollView>
-
-        <Button
-            android:id="@+id/button_gatt_server"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="16dp"
-            android:text="@string/open_gatt_server"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent" />
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
+    <Button
+        android:id="@+id/button_advertise"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="16dp"
+        android:text="@string/start_advertising"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_gatt_server.xml b/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_gatt_server.xml
new file mode 100644
index 0000000..e811a35
--- /dev/null
+++ b/bluetooth/integration-tests/testapp/src/main/res/layout/fragment_gatt_server.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<androidx.constraintlayout.widget.ConstraintLayout
+    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">
+
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintTop_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/recycler_view_gatt_server_services"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                app:layoutManager="LinearLayoutManager"
+                tools:itemCount="1"
+                tools:listitem="@layout/item_gatt_server_service" />
+
+            <Button
+                android:id="@+id/button_add_service"
+                style="@style/Widget.MaterialComponents.Button.TextButton"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_margin="16dp"
+                android:text="@string/add_service" />
+
+        </LinearLayout>
+
+    </androidx.core.widget.NestedScrollView>
+
+    <Button
+        android:id="@+id/button_gatt_server"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="16dp"
+        android:text="@string/open_gatt_server"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/menu/bottom_nav_menu.xml b/bluetooth/integration-tests/testapp/src/main/res/menu/bottom_nav_menu.xml
index d3c5b8f..7a86f58 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/menu/bottom_nav_menu.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/menu/bottom_nav_menu.xml
@@ -26,4 +26,9 @@
         android:icon="@drawable/baseline_wb_iridescent_24"
         android:title="@string/title_advertiser" />
 
+    <item
+        android:id="@+id/navigation_gatt_server"
+        android:icon="@drawable/baseline_design_services_24"
+        android:title="@string/title_gatt_server" />
+
 </menu>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/navigation/nav_graph.xml b/bluetooth/integration-tests/testapp/src/main/res/navigation/nav_graph.xml
index 488e0f06..f765c35 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/navigation/nav_graph.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/navigation/nav_graph.xml
@@ -32,4 +32,10 @@
         android:label="@string/title_advertiser"
         tools:layout="@layout/fragment_advertiser" />
 
+    <fragment
+        android:id="@+id/navigation_gatt_server"
+        android:name="androidx.bluetooth.integration.testapp.ui.gatt_server.GattServerFragment"
+        android:label="@string/title_gatt_server"
+        tools:layout="@layout/fragment_gatt_server" />
+
 </navigation>
diff --git a/bluetooth/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml b/bluetooth/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
index 7065405c..fe0816a 100644
--- a/bluetooth/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
+++ b/bluetooth/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
@@ -17,14 +17,12 @@
 <resources>
     <string name="app_name">AndroidX Bluetooth Test App</string>
 
-    <string name="title_scanner">Scanner</string>
-    <string name="title_advertiser">Advertiser</string>
-
     <!-- Main -->
     <string name="bluetooth_is_disabled">Bluetooth is disabled</string>
     <string name="enable">Enable</string>
 
     <!-- Scanner -->
+    <string name="title_scanner">Scanner</string>
     <string name="start_scanning">Start Scanning</string>
     <string name="stop_scanning">Stop scanning</string>
     <string name="scan_result_icon">Scan Result Icon</string>
@@ -53,6 +51,7 @@
     <string name="value">Value</string>
 
     <!-- Advertiser -->
+    <string name="title_advertiser">Advertiser</string>
     <string name="configure_advertising_packet">Configure Advertising Packet</string>
     <string name="display_name">Display Name</string>
     <string name="include_device_name">Include Device Name</string>
@@ -73,7 +72,7 @@
     <string name="clear_data">Clear Data</string>
 
     <!-- GATT Server -->
-    <string name="gatt_server">Gatt Server</string>
+    <string name="title_gatt_server">Gatt Server</string>
     <string name="add_service">Add Service</string>
     <string name="add_characteristic">Add Characteristic</string>
     <string name="add_descriptor">Add Descriptor</string>
diff --git a/browser/browser/build.gradle b/browser/browser/build.gradle
index f069ad0..d42a556 100644
--- a/browser/browser/build.gradle
+++ b/browser/browser/build.gradle
@@ -7,9 +7,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 16
-    }
     buildFeatures {
         aidl = true
     }
diff --git a/browser/browser/src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java b/browser/browser/src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java
index 4978624..4403c2a 100644
--- a/browser/browser/src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java
+++ b/browser/browser/src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java
@@ -34,7 +34,6 @@
 import android.provider.Browser;
 
 import androidx.annotation.ColorRes;
-import androidx.annotation.RequiresApi;
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Test;
@@ -51,9 +50,6 @@
 @SuppressWarnings("deprecation")
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
-// minSdk For Bundle#getBinder
-@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
-@Config(minSdk = Build.VERSION_CODES.JELLY_BEAN_MR2)
 public class CustomTabsIntentTest {
 
     @Test
diff --git a/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java b/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
index 3ef37df..33fabb6 100644
--- a/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
+++ b/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
@@ -26,10 +26,8 @@
 
 import android.content.Intent;
 import android.net.Uri;
-import android.os.Build;
 import android.os.Bundle;
 
-import androidx.annotation.RequiresApi;
 import androidx.browser.customtabs.CustomTabColorSchemeParams;
 import androidx.browser.customtabs.CustomTabsIntent;
 import androidx.browser.customtabs.CustomTabsSession;
@@ -42,7 +40,6 @@
 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.Arrays;
@@ -53,9 +50,6 @@
  */
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
-// minSdk For Bundle#getBinder
-@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
-@Config(minSdk = Build.VERSION_CODES.JELLY_BEAN_MR2)
 public class TrustedWebActivityIntentBuilderTest {
 
     @SuppressWarnings("deprecation")
diff --git a/buildSrc-tests/src/test/java/androidx/build/MavenUploadHelperTest.kt b/buildSrc-tests/src/test/java/androidx/build/MavenUploadHelperTest.kt
index 97de634..da267c6 100644
--- a/buildSrc-tests/src/test/java/androidx/build/MavenUploadHelperTest.kt
+++ b/buildSrc-tests/src/test/java/androidx/build/MavenUploadHelperTest.kt
@@ -135,6 +135,7 @@
       <groupId>androidx.compose.ui</groupId>
       <artifactId>ui-geometry-android</artifactId>
       <version>1.6.0-alpha01</version>
+      <type>aar</type>
       <scope>runtime</scope>
     </dependency>
   </dependencies>
@@ -261,7 +262,7 @@
 """
         /* ktlint-enable max-line-length */
 
-        assignAarTypes(pom, androidLibrariesSet)
+        assignAarDependencyTypes(pom, androidLibrariesSet)
 
         val actual = pom.toString()
         assertEquals(expected, actual)
diff --git a/buildSrc-tests/src/test/java/androidx/build/clang/KonanBuildServiceTest.kt b/buildSrc-tests/src/test/java/androidx/build/clang/KonanBuildServiceTest.kt
new file mode 100644
index 0000000..b529145
--- /dev/null
+++ b/buildSrc-tests/src/test/java/androidx/build/clang/KonanBuildServiceTest.kt
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.clang
+
+import androidx.testutils.assertThrows
+import androidx.testutils.gradle.ProjectSetupRule
+import com.google.common.truth.Truth.assertThat
+import java.io.ByteArrayOutputStream
+import java.io.File
+import org.gradle.api.GradleException
+import org.gradle.api.Project
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.plugins.ExtraPropertiesExtension
+import org.gradle.testfixtures.ProjectBuilder
+import org.jetbrains.kotlin.konan.target.KonanTarget
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+
+class KonanBuildServiceTest {
+    @get:Rule
+    val projectSetup = ProjectSetupRule()
+    @get:Rule
+    val tmpFolder = TemporaryFolder()
+    private lateinit var project: Project
+    private lateinit var buildService: KonanBuildService
+
+    @Before
+    fun init() {
+        project = ProjectBuilder.builder()
+            .withProjectDir(projectSetup.rootDir)
+            .build()
+        val extension = project.rootProject.property("ext") as ExtraPropertiesExtension
+        // build service needs prebuilts location to "download" clang and targets.
+        extension.set(
+            "prebuiltsRoot",
+            File(projectSetup.props.rootProjectPath).resolve("../../prebuilts")
+        )
+        buildService = KonanBuildService.obtain(project).get()
+    }
+
+    @Test
+    fun compilationFailure() {
+        val compileParams = createCompileParameters(
+            "failedCode.c", """
+            #include <stdio.h>
+            int main() {
+               printf("Hello, World!");
+               return 0 // no ; :)
+            }
+        """.trimIndent()
+        )
+        assertThrows<GradleException> {
+            buildService.compile(compileParams)
+        }.hasMessageThat().contains(
+            "expected ';' after return statement"
+        )
+    }
+
+    @Test
+    fun compile() {
+        val compileParams = createCompileParameters("code.c", C_HELLO_WORLD)
+        buildService.compile(compileParams)
+        val outputFiles = compileParams.output.getRegularFiles()
+        assertThat(outputFiles).hasSize(1)
+        val outputFile = outputFiles.single()
+        assertThat(
+            outputFile.name
+        ).isEqualTo("code.o")
+        val strings = extractStrings(outputFile)
+        assertThat(strings).contains("Hello, World!")
+        // shouldn't link yet
+        assertThat(strings).doesNotContain("libc")
+    }
+
+    @Test
+    fun compileWithInclude() {
+        val compileParameters = createCompileParameters(
+            "code.c",
+            """
+            #include <stdio.h>
+            #include "dependency.h"
+            int my_function() {
+               return dependency_method();
+            }
+            """.trimIndent()
+        )
+        val dependency = tmpFolder.newFolder("depSrc").also {
+            it.resolve("dependency.h").writeText(
+                """
+                    int dependency_method();
+                """.trimIndent()
+            )
+        }
+        compileParameters.includes.from(
+            dependency
+        )
+        buildService.compile(compileParameters)
+        val outputFiles = compileParameters.output.getRegularFiles()
+        val strings = extractStrings(outputFiles.single())
+        assertThat(
+            strings
+        ).contains("dependency_method")
+    }
+
+    @Test
+    fun createSharedLibrary() {
+        val compileParameters = createCompileParameters("code.c", C_HELLO_WORLD)
+        buildService.compile(compileParameters)
+        val sharedLibraryParameters = project.objects
+            .newInstance(ClangSharedLibraryParameters::class.java)
+        sharedLibraryParameters.konanTarget.set(compileParameters.konanTarget)
+        sharedLibraryParameters.objectFiles.from(compileParameters.output)
+        val outputFile = tmpFolder.newFile("code.so")
+        sharedLibraryParameters.outputFile.set(outputFile)
+        buildService.createSharedLibrary(sharedLibraryParameters)
+
+        val strings = extractStrings(outputFile)
+        assertThat(strings).contains("Hello, World!")
+        // should link with libc
+        assertThat(strings).contains("libc")
+    }
+
+    @Test
+    fun archive() {
+        val compileParams = createCompileParameters("code.c", C_HELLO_WORLD)
+        buildService.compile(compileParams)
+        val archiveParams = project.objects.newInstance(ClangArchiveParameters::class.java)
+        archiveParams.konanTarget.set(compileParams.konanTarget)
+        archiveParams.objectFiles.from(compileParams.output)
+        val outputFile = tmpFolder.newFile("code.a")
+        archiveParams.outputFile.set(outputFile)
+        buildService.archiveLibrary(archiveParams)
+
+        val strings = extractStrings(outputFile)
+        assertThat(strings).contains("Hello, World!")
+        // should not with libc
+        assertThat(strings).doesNotContain("libc")
+    }
+
+    private fun createCompileParameters(
+        fileName: String,
+        code: String
+    ): ClangCompileParameters {
+        val srcDir = tmpFolder.newFolder("src")
+        srcDir.resolve(fileName).writeText(
+            code
+        )
+        val compileParams = project.objects.newInstance(ClangCompileParameters::class.java)
+        compileParams.konanTarget.set(
+            SerializableKonanTarget(KonanTarget.LINUX_X64)
+        )
+        compileParams.output.set(
+            tmpFolder.newFolder()
+        )
+        compileParams.sources.from(srcDir)
+        return compileParams
+    }
+
+    private fun DirectoryProperty.getRegularFiles() = get().asFile.walkTopDown().filter {
+        it.isFile
+    }.toList()
+
+    /**
+     * Extract strings from a binary file so that we can assert output contents.
+     */
+    private fun extractStrings(
+        file: File
+    ): String {
+        val outputStream = ByteArrayOutputStream()
+        val errorStream = ByteArrayOutputStream()
+        val response = project.exec {
+            it.executable = "strings"
+            it.setErrorOutput(errorStream)
+            it.setStandardOutput(outputStream)
+            it.isIgnoreExitValue = true
+            it.args(file.canonicalPath)
+        }
+        if (response.exitValue != 0) {
+            throw AssertionError(
+                """
+                Couldn't read strings from file.
+                Output:
+                ${outputStream.toString(Charsets.UTF_8)}
+                Error:
+                ${errorStream.toString(Charsets.UTF_8)}
+            """.trimIndent()
+            )
+        }
+        return outputStream.toString(Charsets.UTF_8)
+    }
+
+    companion object {
+        private val C_HELLO_WORLD = """
+            #include <stdio.h>
+            int my_function() {
+               printf("Hello, World!");
+               return 0;
+            }
+        """.trimIndent()
+    }
+}
diff --git a/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt b/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
index 375126a..b1b65e6 100644
--- a/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
+++ b/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
@@ -16,8 +16,13 @@
 
 package androidx.build.dependencyTracker
 
+import java.io.File
+import java.util.function.BiFunction
+import java.util.function.Predicate
 import org.gradle.api.Project
+import org.gradle.api.Transformer
 import org.gradle.api.plugins.ExtraPropertiesExtension
+import org.gradle.api.provider.Provider
 import org.gradle.testfixtures.ProjectBuilder
 import org.hamcrest.CoreMatchers
 import org.hamcrest.MatcherAssert
@@ -27,7 +32,6 @@
 import org.junit.rules.TemporaryFolder
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import java.io.File
 
 @RunWith(JUnit4::class)
 class AffectedModuleDetectorImplTest {
@@ -164,6 +168,31 @@
             .build()
     }
 
+    class TestProvider(private val list: List<String>) : Provider<List<String>> {
+        override fun get(): List<String> = list
+        override fun getOrNull(): List<String> = list
+        override fun isPresent(): Boolean = TODO("used")
+        override fun forUseAtConfigurationTime(): Provider<List<String>> = TODO("used")
+        override fun <U : Any?, R : Any?> zip(
+            right: Provider<U>,
+            combiner: BiFunction<in List<String>, in U, out R?>
+        ): Provider<R> = TODO("used")
+        override fun orElse(provider: Provider<out List<String>>): Provider<List<String>> {
+            TODO("used")
+        }
+        override fun orElse(value: List<String>): Provider<List<String>> = TODO("used")
+        override fun <S : Any?> flatMap(
+            transformer: Transformer<out Provider<out S>?, in List<String>>
+        ): Provider<S> = TODO("used")
+        override fun filter(predicate: Predicate<in List<String>>): Provider<List<String>> {
+            TODO("used")
+        }
+        override fun <S : Any?> map(
+            transformer: Transformer<out S?, in List<String>>
+        ): Provider<S> = TODO("used")
+        override fun getOrElse(defaultValue: List<String>): List<String> = TODO("used")
+    }
+
     @Test
     fun noChangeCLs() {
         val detector = AffectedModuleDetectorImpl(
@@ -172,9 +201,7 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
-                emptyList()
-            }
+            changedFilesProvider = TestProvider(emptyList())
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -204,9 +231,9 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(convertToFilePath("p1", "foo.java"))
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -230,12 +257,12 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(
                     convertToFilePath("p1", "foo.java"),
                     convertToFilePath("p2", "bar.java")
                 )
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -259,9 +286,9 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf("foo.java")
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -291,9 +318,9 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf("foo.java", convertToFilePath("p7", "bar.java"))
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -323,13 +350,13 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(
                     convertToFilePath(
                         "p8", "foo.java"
                     )
                 )
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -353,13 +380,13 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = setOf(setOf(":cobuilt1", ":cobuilt2", ":cobuilt3")),
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(
                     convertToFilePath(
                         "p8", "foo.java"
                     )
                 )
-            }
+            )
         )
         // This should trigger IllegalStateException due to missing cobuilt3
         detector.changedProjects
@@ -373,13 +400,13 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = setOf(setOf("cobuilt3", "cobuilt4", "cobuilt5")),
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(
                     convertToFilePath(
                         "p8", "foo.java"
                     )
                 )
-            }
+            )
         )
         // There should be no exception thrown here because *all* cobuilts are missing.
         detector.changedProjects
@@ -392,9 +419,9 @@
             dependencyTracker = dependencyTracker,
             logger = logger,
             ignoreUnknownProjects = false,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(convertToFilePath("p1", "foo.java"))
-            }
+            )
         )
         // Verify expectations on affected projects
         MatcherAssert.assertThat(
@@ -439,9 +466,7 @@
             dependencyTracker = dependencyTracker,
             logger = logger,
             ignoreUnknownProjects = false,
-            changedFilesProvider = {
-                emptyList()
-            }
+            changedFilesProvider = TestProvider(emptyList())
         )
         // Verify expectations on affected projects
         MatcherAssert.assertThat(
@@ -485,9 +510,9 @@
             dependencyTracker = dependencyTracker,
             logger = logger,
             ignoreUnknownProjects = false,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(convertToFilePath("unknown", "file.java"))
-            }
+            )
         )
         // Verify expectations on affected projects
         MatcherAssert.assertThat(
@@ -532,9 +557,9 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf("playground-common/tmp.kt")
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -558,9 +583,9 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(".github/workflows/bar.txt")
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -584,9 +609,9 @@
             logger = logger,
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf("playground-common/tmp.kt", "root.txt")
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.buildAll,
@@ -605,9 +630,9 @@
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
             ignoredPaths = ignoredPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(convertToFilePath("ignored", "example.txt"))
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.buildAll,
@@ -626,12 +651,12 @@
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
             ignoredPaths = ignoredPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(
                     convertToFilePath("ignored", "example.txt"),
                     convertToFilePath("p1", "foo.kt")
                 )
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.changedProjects,
@@ -656,12 +681,12 @@
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
             ignoredPaths = ignoredPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(
                     convertToFilePath("ignored", "example.txt"),
                     convertToFilePath("unknown", "foo.kt")
                 )
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.buildAll,
@@ -680,13 +705,13 @@
             ignoreUnknownProjects = false,
             cobuiltTestPaths = cobuiltTestPaths,
             ignoredPaths = ignoredPaths,
-            changedFilesProvider = {
+            changedFilesProvider = TestProvider(
                 listOf(
                     "ignored/eg.txt",
                     convertToFilePath("unknown", "foo.kt"),
                     convertToFilePath("p1", "bar.kt")
                 )
-            }
+            )
         )
         MatcherAssert.assertThat(
             detector.buildAll,
diff --git a/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/ChangeInfoGitClientTest.kt b/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/ChangeInfoGitClientTest.kt
deleted file mode 100644
index c5c6a59..0000000
--- a/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/ChangeInfoGitClientTest.kt
+++ /dev/null
@@ -1,273 +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.dependencyTracker
-
-import androidx.build.gitclient.ChangeInfoGitClient
-import com.google.gson.JsonSyntaxException
-import junit.framework.TestCase.assertEquals
-import org.gradle.api.GradleException
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class ChangeInfoGitClientTest {
-    @Test
-    fun findChangedFilesSince_oneChange() {
-        checkChangedFiles(
-            """
-            {
-              "changes": [
-                {
-                  "project": "platform/frameworks/support",
-                  "revisions": [
-                    {
-                      "fileInfos": [
-                        {
-                          "path": "core/core-remoteviews/src/androidTest/res/layout/remote_views_text.xml",
-                          "status": "added"
-                        }
-                      ]
-                    }
-                  ]
-                }
-              ]
-            }
-            """,
-            listOf("core/core-remoteviews/src/androidTest/res/layout/remote_views_text.xml")
-        )
-    }
-
-    @Test
-    fun findChangedFilesSince_multipleChanges() {
-        checkChangedFiles(
-            """
-            {
-              "changes": [
-                {
-                  "project": "platform/frameworks/support",
-                  "revisions": [
-                    {
-                      "fileInfos": [
-                        {
-                          "path": "path1",
-                          "status": "added"
-                        }
-                      ]
-                    }
-                  ]
-                },
-                {
-                  "project": "platform/frameworks/support",
-                  "revisions": [
-                    {
-                      "fileInfos": [
-                        {
-                          "path": "path2",
-                          "status": "added"
-                        }
-                      ]
-                    }
-                  ]
-                }
-              ]
-            }
-            """,
-            listOf("path1", "path2")
-        )
-    }
-
-    @Test
-    fun findChangedFilesSince_otherRepo() {
-        checkChangedFiles(
-            """
-            {
-              "changes": [
-                {
-                  "project": "platform/frameworks/support",
-                  "revisions": [
-                    {
-                      "fileInfos": [
-                        {
-                          "path": "supportPath",
-                          "status": "added"
-                        }
-                      ]
-                    }
-                  ]
-                },
-                {
-                  "project": "platform/prebuilts/androidx/external",
-                  "revisions": [
-                    {
-                      "fileInfos": [
-                        {
-                          "path": "externalPath",
-                          "status": "added"
-                        }
-                      ]
-                    }
-                  ]
-                }
-              ]
-            }
-            """,
-            listOf("supportPath")
-        )
-    }
-
-    @Test
-    fun findChangedFilesSince_emptyChange() {
-        checkChangedFiles(
-            """
-            {
-              "changes": [
-                {
-                  "project": "platform/frameworks/support",
-                  "revisions": [
-                    {
-                    }
-                  ]
-                }
-              ]
-            }
-            """,
-            listOf()
-        )
-    }
-
-    @Test
-    fun findChangedFilesSince_noChanges() {
-        checkChangedFiles(
-            """
-            {
-            }
-            """,
-            listOf()
-        )
-    }
-
-    @Test
-    fun findChangedFilesSince_deletedFile() {
-        checkChangedFiles(
-            """
-            {
-              "changes": [
-                {
-                  "project": "platform/frameworks/support",
-                  "revisions": [
-                    {
-                      "fileInfos": [
-                        {
-                          "oldPath": "Gone",
-                          "status": "deleted"
-                        }
-                      ]
-                    }
-                  ]
-                }
-              ]
-            }
-            """,
-            listOf("Gone")
-        )
-    }
-
-    @Test
-    fun findChangedFilesSince_movedFile() {
-        checkChangedFiles(
-            """
-            {
-              "changes": [
-                {
-                  "project": "platform/frameworks/support",
-                  "revisions": [
-                    {
-                      "fileInfos": [
-                        {
-                          "oldPath": "PrevPath",
-                          "path": "NewPath",
-                          "status": "renamed"
-                        }
-                      ]
-                    }
-                  ]
-                }
-              ]
-            }
-            """,
-            listOf("PrevPath", "NewPath")
-        )
-    }
-
-    @Test(expected = JsonSyntaxException::class)
-    fun findChangedFilesSince_malformedJson() {
-        checkChangedFiles("{", listOf())
-    }
-
-    fun checkChangedFiles(config: String, expectedFiles: List<String>) {
-        assertEquals(getChangedFiles(config), expectedFiles)
-    }
-
-    fun getChangedFiles(config: String): List<String> {
-        val client = ChangeInfoGitClient(
-            config,
-            """
-            <manifest>
-                <project path="frameworks/support" name="platform/frameworks/support"/>
-            </manifest>
-            """,
-            "frameworks/support")
-        return client.findChangedFilesSince("")
-    }
-
-    @Test
-    fun getHeadSha_hasVersion() {
-        checkVersion("""
-            <manifest>
-                <project path="prebuilts/internal" name="platform/prebuilts/internal" revision="prebuiltsVersion1"/>
-                <project path="frameworks/support" name="platform/frameworks/support" revision="supportVersion1"/>
-                <project path="tools/external/gradle" name="platform/tools/external/gradle" revision="gradleVersion1"/>
-            </manifest>
-            """,
-            "supportVersion1"
-        )
-    }
-
-    @Test
-    fun getHeadSha_noVersion() {
-        var threw = false
-        try {
-            checkVersion("""
-                <manifest/>
-                """,
-                null
-            )
-        } catch (e: GradleException) {
-            threw = true
-        }
-        assertEquals("Did not detect malformed manifest", threw, true)
-    }
-
-    fun checkVersion(config: String, expectedVersion: String?) {
-        assertEquals(expectedVersion, getVersion(config))
-    }
-    fun getVersion(config: String): String {
-        return ChangeInfoGitClient("{}", config, "frameworks/support")
-            .getHeadSha()
-    }
-}
diff --git a/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/ChangeInfoProvidersTest.kt b/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/ChangeInfoProvidersTest.kt
new file mode 100644
index 0000000..6b35b15
--- /dev/null
+++ b/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/ChangeInfoProvidersTest.kt
@@ -0,0 +1,286 @@
+/*
+ * 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.dependencyTracker
+
+import androidx.build.gitclient.getChangedFilesFromChangeInfoProvider
+import androidx.build.gitclient.getHeadShaFromManifestProvider
+import com.google.gson.JsonSyntaxException
+import org.gradle.api.GradleException
+import org.gradle.testfixtures.ProjectBuilder
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertThrows
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ChangeInfoProvidersTest {
+    @get:Rule
+    var folder: TemporaryFolder = TemporaryFolder()
+
+    @Test
+    fun findChangedFilesSince_oneChange() {
+        checkChangedFiles(
+            """
+            {
+              "changes": [
+                {
+                  "project": "platform/frameworks/support",
+                  "revisions": [
+                    {
+                      "fileInfos": [
+                        {
+                          "path": "core/core-remoteviews/src/androidTest/res/layout/remote_views_text.xml",
+                          "status": "added"
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+            """,
+            listOf("core/core-remoteviews/src/androidTest/res/layout/remote_views_text.xml")
+        )
+    }
+
+    @Test
+    fun findChangedFilesSince_multipleChanges() {
+        checkChangedFiles(
+            """
+            {
+              "changes": [
+                {
+                  "project": "platform/frameworks/support",
+                  "revisions": [
+                    {
+                      "fileInfos": [
+                        {
+                          "path": "path1",
+                          "status": "added"
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "project": "platform/frameworks/support",
+                  "revisions": [
+                    {
+                      "fileInfos": [
+                        {
+                          "path": "path2",
+                          "status": "added"
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+            """,
+            listOf("path1", "path2")
+        )
+    }
+
+    @Test
+    fun findChangedFilesSince_otherRepo() {
+        checkChangedFiles(
+            """
+            {
+              "changes": [
+                {
+                  "project": "platform/frameworks/support",
+                  "revisions": [
+                    {
+                      "fileInfos": [
+                        {
+                          "path": "supportPath",
+                          "status": "added"
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "project": "platform/prebuilts/androidx/external",
+                  "revisions": [
+                    {
+                      "fileInfos": [
+                        {
+                          "path": "externalPath",
+                          "status": "added"
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+            """,
+            listOf("supportPath")
+        )
+    }
+
+    @Test
+    fun findChangedFilesSince_emptyChange() {
+        checkChangedFiles(
+            """
+            {
+              "changes": [
+                {
+                  "project": "platform/frameworks/support",
+                  "revisions": [
+                    {
+                    }
+                  ]
+                }
+              ]
+            }
+            """,
+            listOf()
+        )
+    }
+
+    @Test
+    fun findChangedFilesSince_noChanges() {
+        checkChangedFiles(
+            """
+            {
+            }
+            """,
+            listOf()
+        )
+    }
+
+    @Test
+    fun findChangedFilesSince_deletedFile() {
+        checkChangedFiles(
+            """
+            {
+              "changes": [
+                {
+                  "project": "platform/frameworks/support",
+                  "revisions": [
+                    {
+                      "fileInfos": [
+                        {
+                          "oldPath": "Gone",
+                          "status": "deleted"
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+            """,
+            listOf("Gone")
+        )
+    }
+
+    @Test
+    fun findChangedFilesSince_movedFile() {
+        checkChangedFiles(
+            """
+            {
+              "changes": [
+                {
+                  "project": "platform/frameworks/support",
+                  "revisions": [
+                    {
+                      "fileInfos": [
+                        {
+                          "oldPath": "PrevPath",
+                          "path": "NewPath",
+                          "status": "renamed"
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+            """,
+            listOf("PrevPath", "NewPath")
+        )
+    }
+
+    @Test(expected = JsonSyntaxException::class)
+    fun findChangedFilesSince_malformedJson() {
+        checkChangedFiles("{", listOf())
+    }
+
+    private fun checkChangedFiles(
+        changeInfoContent: String,
+        expectedChangedFiles: List<String>
+    ) {
+        val manifestFile = folder.newFile()
+        manifestFile.writeText(basicManifest)
+        val changeInfoFile = folder.newFile()
+        changeInfoFile.writeText(changeInfoContent)
+        val project = ProjectBuilder.builder().build()
+        val changedFilesProvider = project.getChangedFilesFromChangeInfoProvider(
+            manifestFile.absolutePath,
+            changeInfoFile.absolutePath,
+            frameworksSupportPath
+        )
+        val changedFiles = changedFilesProvider.get()
+        assertEquals(expectedChangedFiles, changedFiles)
+    }
+
+    @Test
+    fun headShaFromManifest() {
+        val manifestFile = folder.newFile()
+        manifestFile.writeText(basicManifest)
+        val project = ProjectBuilder.builder().build()
+        val headShaProvider = project.getHeadShaFromManifestProvider(
+            manifestFile.absolutePath,
+            frameworksSupportPath
+        )
+        assertEquals(frameworksSupportSha, headShaProvider.get())
+    }
+
+    @Test
+    fun missingProjectHeadShaFromManifest() {
+        val manifestFile = folder.newFile()
+        manifestFile.writeText(basicManifest)
+        val project = ProjectBuilder.builder().build()
+        val headShaProvider = project.getHeadShaFromManifestProvider(
+            manifestFile.absolutePath,
+            "missing/project/path"
+        )
+        assertThrows(GradleException::class.java) {
+            headShaProvider.get()
+        }
+    }
+}
+
+private const val frameworksSupportPath = "frameworks/support"
+private const val frameworksSupportSha = "bbcf23f3ee42fc9e59e0cf5fbca71f526f760dba"
+private const val basicManifest = """<?xml version='1.0' encoding='UTF-8'?>
+<manifest>
+  <remote name="aosp" fetch="https://android.googlesource.com/" review="https://android.googlesource.com/" />
+  <default revision="androidx-main" remote="aosp" />
+  <superproject name="platform/superproject" remote="aosp" />
+  <project path="external/icing" name="platform/external/icing" clone-depth="1" revision="ea81bd0613730609fcf3c6ffa7d2e52bcc10a9ac" />
+  <project path="$frameworksSupportPath" name="platform/frameworks/support" revision="$frameworksSupportSha" />
+  <repo-hooks in-project="platform/tools/repohooks" enabled-list="pre-upload" />
+</manifest>
+"""
diff --git a/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/GitRunnerGitClientTest.kt b/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/GitRunnerGitClientTest.kt
deleted file mode 100644
index 7a5b452..0000000
--- a/buildSrc-tests/src/test/java/androidx/build/dependencyTracker/GitRunnerGitClientTest.kt
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.build.dependencyTracker
-
-import androidx.build.gitclient.GitClient
-import androidx.build.gitclient.GitRunnerGitClient
-import androidx.build.gitclient.GitRunnerGitClient.Companion.CHANGED_FILES_CMD_PREFIX
-import androidx.build.gitclient.GitRunnerGitClient.Companion.PREVIOUS_SUBMITTED_CMD
-import java.io.File
-import junit.framework.TestCase.assertEquals
-import junit.framework.TestCase.assertFalse
-import junit.framework.TestCase.assertNull
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class GitRunnerGitClientTest {
-    @Rule
-    @JvmField
-    val attachLogsRule = AttachLogsTestRule()
-    private val logger = attachLogsRule.logger
-    private val commandRunner = MockCommandRunner(logger)
-    /** The [GitRunnerGitClient.workingDir] uses `System.getProperty("user.dir")` because the working
-     * directory passed to the [GitRunnerGitClient] constructor needs to contain the a .git
-     * directory somewhere in the parent directory tree.  @see [GitRunnerGitClient]
-     */
-    private val workingDir = File(System.getProperty("user.dir")).parentFile
-    private val client = GitRunnerGitClient(
-        workingDir = workingDir,
-        logger = logger,
-        commandRunner = commandRunner
-    )
-
-    @Test
-    fun findMerge() {
-        commandRunner.addReply(
-                PREVIOUS_SUBMITTED_CMD,
-                "abcdefghij (m/androidx-md, aosp/androidx-md) Merge blah blah into and"
-        )
-        assertEquals(
-                "abcdefghij",
-                client.findPreviousSubmittedChange())
-    }
-
-    @Test
-    fun findMerge_fail() {
-        assertNull(client.findPreviousSubmittedChange())
-    }
-
-    @Test
-    fun findChangesSince() {
-        var changes = listOf(
-                convertToFilePath("a", "b", "c.java"),
-                convertToFilePath("d", "e", "f.java"))
-        commandRunner.addReply(
-                "$CHANGED_FILES_CMD_PREFIX HEAD mySha",
-                changes.joinToString(System.lineSeparator())
-        )
-        assertEquals(
-                changes,
-                client.findChangedFilesSince(sha = "mySha"))
-    }
-
-    @Test
-    fun findChangesSince_empty() {
-        assertEquals(
-                emptyList<String>(),
-                client.findChangedFilesSince("foo"))
-    }
-
-    @Test
-    fun checkLatestCommitExists() {
-        val headCommit: String = GitRunnerGitClient(workingDir, logger).getHeadSha()
-        assertFalse(headCommit.isEmpty())
-    }
-
-    // For both Linux/Windows
-    fun convertToFilePath(vararg list: String): String {
-        return list.toList().joinToString(File.separator)
-    }
-
-    private class MockCommandRunner(val logger: ToStringLogger) : GitClient.CommandRunner {
-        private val replies = mutableMapOf<String, List<String>>()
-
-        fun addReply(command: String, response: String) {
-            logger.info("add reply. cmd: $command response: $response")
-            replies[command] = response.split(System.lineSeparator())
-        }
-
-        override fun execute(command: String): String {
-            return replies.getOrDefault(command, emptyList())
-                .joinToString(System.lineSeparator()).also {
-                    logger.info("cmd: $command response: $it")
-            }
-        }
-
-        override fun executeAndParse(command: String): List<String> {
-            return replies.getOrDefault(command, emptyList()).also {
-                logger.info("cmd: $command response: $it")
-            }
-        }
-    }
-}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
index ccef16b..a7d7478 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXExtension.kt
@@ -16,8 +16,8 @@
 
 package androidx.build
 
-import androidx.build.buildInfo.CreateLibraryBuildInfoFileTask.Companion.getFrameworksSupportCommitShaAtHead
 import androidx.build.checkapi.shouldConfigureApiTasks
+import androidx.build.gitclient.getHeadShaProvider
 import androidx.build.transform.configureAarAsJarForConfiguration
 import groovy.lang.Closure
 import java.io.File
@@ -410,9 +410,7 @@
         configureAarAsJarForConfiguration(project, name)
     }
 
-    fun getReferenceSha(): Provider<String> {
-        return project.providers.provider { project.getFrameworksSupportCommitShaAtHead() }
-    }
+    fun getReferenceSha(): Provider<String> = getHeadShaProvider(project)
 
     /**
      * Specify the version for Kotlin API compatibility mode used during Kotlin compilation.
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index f4c04e2..b594507 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -40,6 +40,7 @@
 import com.android.build.api.variant.ApplicationAndroidComponentsExtension
 import com.android.build.api.variant.HasAndroidTest
 import com.android.build.api.variant.LibraryAndroidComponentsExtension
+import com.android.build.api.variant.ResourcesPackaging
 import com.android.build.api.variant.Variant
 import com.android.build.gradle.AppExtension
 import com.android.build.gradle.AppPlugin
@@ -461,6 +462,7 @@
         project.extensions.getByType<AppExtension>().apply {
             configureAndroidBaseOptions(project, androidXExtension)
             configureAndroidApplicationOptions(project, androidXExtension)
+            excludeVersionFiles(packagingOptions.resources)
         }
 
         project.extensions.getByType<ApplicationAndroidComponentsExtension>().apply {
@@ -478,6 +480,7 @@
         project.extensions.getByType<TestExtension>().apply {
             configureAndroidBaseOptions(project, androidXExtension)
             project.addAppApkToTestConfigGeneration(androidXExtension)
+            excludeVersionFiles(packagingOptions.resources)
         }
 
         project.configureJavaCompilationWarnings(androidXExtension)
@@ -485,6 +488,22 @@
         project.addToProjectMap(androidXExtension)
     }
 
+    /**
+     * Excludes files telling which versions of androidx libraries were used in test apks, to avoid
+     * invalidating caches as often
+     */
+    private fun excludeVersionFiles(packaging: com.android.build.api.variant.ResourcesPackaging) {
+        packaging.excludes.add("/META-INF/androidx*.version")
+    }
+
+    /**
+     * Excludes files telling which versions of androidx libraries were used in test apks, to avoid
+     * invalidating caches as often
+     */
+    private fun excludeVersionFiles(packaging: com.android.build.api.dsl.ResourcesPackaging) {
+        packaging.excludes.add("/META-INF/androidx*.version")
+    }
+
     private fun Project.buildOnServerDependsOnAssembleRelease() {
         project.addToBuildOnServer("assembleRelease")
     }
@@ -511,7 +530,7 @@
 
     private fun HasAndroidTest.configureTests() {
         configureLicensePackaging()
-        excludeVersionFilesFromTestApks()
+        androidTest?.packaging?.resources?.apply { excludeVersionFiles(this) }
     }
 
     @Suppress("UnstableApiUsage") // usage of experimentalProperties
@@ -533,14 +552,6 @@
         }
     }
 
-    /**
-     * Excludes files telling which versions of androidx libraries were used in test apks to avoid
-     * invalidating the build cache as often
-     */
-    private fun HasAndroidTest.excludeVersionFilesFromTestApks() {
-        androidTest?.packaging?.resources?.apply { excludes.add("/META-INF/androidx*.version") }
-    }
-
     @Suppress("DEPRECATION") // AGP DSL APIs
     private fun configureWithLibraryPlugin(project: Project, androidXExtension: AndroidXExtension) {
         val libraryExtension =
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index 68d6554..3a9dffe 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -291,9 +291,6 @@
         // Disable a check that's only relevant for apps that ship to Play Store. (b/299278101)
         disable.add("ExpiredTargetSdkVersion")
 
-        // Reenable after b/238892319 is resolved
-        disable.add("NotificationPermission")
-
         // Disable dependency checks that suggest to change them. We want libraries to be
         // intentional with their dependency version bumps.
         disable.add("KtxExtensionAvailable")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt b/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
index f0b4877..abeaaac 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
@@ -44,6 +44,7 @@
 import org.gradle.api.publish.maven.internal.publication.MavenPublicationInternal
 import org.gradle.api.publish.maven.tasks.GenerateMavenPom
 import org.gradle.api.publish.tasks.GenerateModuleMetadata
+import org.gradle.api.tasks.bundling.Zip
 import org.gradle.kotlin.dsl.configure
 import org.gradle.kotlin.dsl.create
 import org.gradle.kotlin.dsl.findByType
@@ -154,14 +155,41 @@
             }
         }
         publications.withType(MavenPublication::class.java).all { publication ->
+            val isKmpAnchor = (publication.name == KMP_ANCHOR_PUBLICATION_NAME)
+            val pomPlatform = kmpExtension.defaultPlatform
+            // b/297355397 If a kmp project has Android as the default platform, there might
+            // externally be legacy projects depending on its .pom
+            // We advertise a stub .aar in this .pom for backwards compatibility and
+            // add a dependency on the actual .aar
+            val addStubAar = isKmpAnchor && pomPlatform == PlatformIdentifier.ANDROID.id
+            val buildDir = project.layout.buildDirectory
+            if (addStubAar) {
+                // create a unique namespace for this .aar, different from the android artifact
+                val stubNamespace = project.group.toString().replace(':', '.') + ".anchor"
+                val unpackedStubAarTask =
+                    tasks.register("unpackedStubAar", UnpackedStubAarTask::class.java) { aarTask ->
+                    aarTask.aarPackage.set(stubNamespace)
+                    aarTask.outputDir.set(buildDir.dir("intermediates/stub-aar"))
+                }
+                val stubAarTask = tasks.register("stubAar", Zip::class.java) { zipTask ->
+                    zipTask.from(unpackedStubAarTask.flatMap { it.outputDir })
+                    zipTask.destinationDirectory.set(buildDir.dir("outputs"))
+                    zipTask.archiveExtension.set("aar")
+                }
+                publication.artifact(stubAarTask)
+            }
+
             publication.pom { pom ->
+                if (addStubAar) {
+                    pom.packaging = "aar"
+                }
                 addInformativeMetadata(extension, pom)
                 tweakDependenciesMetadata(
                     androidxGroup,
                     pom,
                     androidLibrariesSetProvider,
-                    publication.name == KMP_ANCHOR_PUBLICATION_NAME,
-                    kmpExtension.defaultPlatform
+                    isKmpAnchor,
+                    pomPlatform
                 )
             }
         }
@@ -463,7 +491,7 @@
         // For more context see:
         // https://android-review.googlesource.com/c/platform/frameworks/support/+/1144664/8/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt#177
         assignSingleVersionDependenciesInGroupForPom(xml, mavenGroup)
-        assignAarTypes(xml, androidLibrariesSetProvider.get())
+        assignAarDependencyTypes(xml, androidLibrariesSetProvider.get())
         ensureConsistentJvmSuffix(xml)
 
         if (kmpAnchor && pomPlatform != null) {
@@ -474,7 +502,7 @@
 
 // TODO(aurimas): remove this when Gradle bug is fixed.
 // https://github.com/gradle/gradle/issues/3170
-fun assignAarTypes(xml: XmlProvider, androidLibrariesSet: Set<String>) {
+fun assignAarDependencyTypes(xml: XmlProvider, androidLibrariesSet: Set<String>) {
     val xmlElement = xml.asElement()
     val dependencies = xmlElement.find { it.nodeName == "dependencies" } as? org.w3c.dom.Element
 
@@ -511,6 +539,9 @@
         appendElement("groupId", groupId)
         appendElement("artifactId", "$artifactId-$platformId")
         appendElement("version", version)
+        if (platformId == PlatformIdentifier.ANDROID.id) {
+            appendElement("type", "aar")
+        }
         appendElement("scope", "runtime")
     }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/UnpackedStubAarTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/UnpackedStubAarTask.kt
new file mode 100644
index 0000000..bcc529a
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/UnpackedStubAarTask.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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
+
+import java.io.File
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.TaskAction
+import org.gradle.work.DisableCachingByDefault
+
+/**
+ * Creates a directory representing a stub (essentially empty) .aar
+ * This directory can be zipped to make an actual .aar
+ */
+@DisableCachingByDefault(because = "Doesn't benefit from caching")
+abstract class UnpackedStubAarTask : DefaultTask() {
+    @get:Input abstract val aarPackage: Property<String>
+    @get:OutputDirectory abstract val outputDir: DirectoryProperty
+
+    @TaskAction
+    fun generate() {
+        // setup
+        val outputDir = outputDir.getAsFile().get()
+        outputDir.deleteRecursively()
+        outputDir.mkdirs()
+        // write AndroidManifest.xml
+        val manifestFile = File("$outputDir/AndroidManifest.xml")
+        val aarPackage = aarPackage.get()
+        val manifestText = """<manifest package="$aarPackage"></manifest>"""
+        manifestFile.writeText(manifestText)
+    }
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
index 544e835b..1d4e147 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
@@ -18,12 +18,11 @@
 
 import androidx.build.AndroidXExtension
 import androidx.build.LibraryGroup
-import androidx.build.buildInfo.CreateLibraryBuildInfoFileTask.Companion.getFrameworksSupportCommitShaAtHead
 import androidx.build.getBuildInfoDirectory
 import androidx.build.getGroupZipPath
 import androidx.build.getProjectZipPath
 import androidx.build.getSupportRootFolder
-import androidx.build.gitclient.GitClient
+import androidx.build.gitclient.getHeadShaProvider
 import androidx.build.jetpad.LibraryBuildInfoFile
 import com.google.common.annotations.VisibleForTesting
 import com.google.gson.GsonBuilder
@@ -239,14 +238,6 @@
                 startsWith("androidx.") &&
                 !startsWith("androidx.test") &&
                 !startsWith("androidx.databinding")
-
-        /* For androidx release notes, the most common use case is to track and publish the last sha
-         * of the build that is released.  Thus, we use frameworks/support to get the sha
-         */
-        fun Project.getFrameworksSupportCommitShaAtHead(): String {
-            val gitClient = GitClient.forProject(project)
-            return gitClient.getHeadSha()
-        }
     }
 }
 
@@ -282,7 +273,7 @@
             pub,
             libraryGroup,
             artifactId,
-            project.provider { project.getFrameworksSupportCommitShaAtHead() }
+            getHeadShaProvider(project)
         )
     rootProject.tasks.named(CreateLibraryBuildInfoFileTask.TASK_NAME).configure {
         it.dependsOn(task)
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangArchiveTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangArchiveTask.kt
new file mode 100644
index 0000000..1f306ea
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangArchiveTask.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.clang
+
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.services.ServiceReference
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.Nested
+import org.gradle.api.tasks.OutputFile
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
+
+@CacheableTask
+abstract class ClangArchiveTask @Inject constructor(
+    private val workerExecutor: WorkerExecutor
+) : DefaultTask() {
+    init {
+        description = "Combines multiple object files (.o) into an archive file (.a)."
+        group = "Build"
+    }
+
+    @Suppress("UnstableApiUsage") // ServiceReference is incubating since 8.0
+    @get:ServiceReference(KonanBuildService.KEY)
+    abstract val konanBuildService: Property<KonanBuildService>
+
+    @get:Nested
+    abstract val llvmArchiveParameters: ClangArchiveParameters
+
+    @TaskAction
+    fun archive() {
+        workerExecutor.noIsolation().submit(
+            ClangArchiveWorker::class.java
+        ) {
+            it.llvmArchiveParameters.set(llvmArchiveParameters)
+            it.buildService.set(konanBuildService)
+        }
+    }
+}
+
+abstract class ClangArchiveParameters {
+    /**
+     * The target platform for the archive file.
+     */
+    @get:Input
+    abstract val konanTarget: Property<SerializableKonanTarget>
+
+    /**
+     * The list of object files that needs to be added to the archive.
+     */
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.NAME_ONLY)
+    abstract val objectFiles: ConfigurableFileCollection
+
+    /**
+     * The final output file that will include the archive of the given
+     * [objectFiles].
+     */
+    @get:OutputFile
+    abstract val outputFile: RegularFileProperty
+}
+
+private abstract class ClangArchiveWorker : WorkAction<ClangArchiveWorker.Params> {
+    interface Params : WorkParameters {
+        val llvmArchiveParameters: Property<ClangArchiveParameters>
+        val buildService: Property<KonanBuildService>
+    }
+
+    override fun execute() {
+        val buildService = parameters.buildService.get()
+        buildService.archiveLibrary(parameters.llvmArchiveParameters.get())
+    }
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangCompileTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangCompileTask.kt
new file mode 100644
index 0000000..0a9c391
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangCompileTask.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.clang
+
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.services.ServiceReference
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.Nested
+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.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
+
+@CacheableTask
+abstract class ClangCompileTask @Inject constructor(
+    private val workerExecutor: WorkerExecutor
+) : DefaultTask() {
+    init {
+        description = "Compiles C sources into an object file (.o)."
+        group = "Build"
+    }
+
+    @Suppress("UnstableApiUsage") // ServiceReference is incubating since 8.0
+    @get:ServiceReference(KonanBuildService.KEY)
+    abstract val konanBuildService: Property<KonanBuildService>
+
+    @get:Nested
+    abstract val clangParameters: ClangCompileParameters
+
+    @TaskAction
+    fun compile() {
+        workerExecutor.noIsolation().submit(
+            ClangCompileWorker::class.java
+        ) {
+            it.buildService.set(konanBuildService)
+            it.clangParameters.set(clangParameters)
+        }
+    }
+}
+
+abstract class ClangCompileParameters {
+    /**
+     * The compilation target platform for which the given inputs will be compiled.
+     */
+    @get:Input
+    abstract val konanTarget: Property<SerializableKonanTarget>
+
+    /**
+     * List of C source files.
+     */
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.NAME_ONLY)
+    abstract val sources: ConfigurableFileCollection
+
+    /**
+     * The output directory where the object files for each source file will be written.
+     */
+    @get:OutputDirectory
+    abstract val output: DirectoryProperty
+
+    /**
+     * List of directories that include the headers used in the compilation.
+     */
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.NONE)
+    abstract val includes: ConfigurableFileCollection
+
+    /**
+     * List of arguments that will be passed into clang during compilation.
+     */
+    @get:Input
+    abstract val freeArgs: ListProperty<String>
+}
+
+private abstract class ClangCompileWorker : WorkAction<ClangCompileWorker.Params> {
+    interface Params : WorkParameters {
+        val clangParameters: Property<ClangCompileParameters>
+        val buildService: Property<KonanBuildService>
+    }
+
+    override fun execute() {
+        val buildService = parameters.buildService.get()
+        buildService.compile(parameters.clangParameters.get())
+    }
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangSharedLibraryTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangSharedLibraryTask.kt
new file mode 100644
index 0000000..625eb58
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/clang/ClangSharedLibraryTask.kt
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.clang
+
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.services.ServiceReference
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.Nested
+import org.gradle.api.tasks.OutputFile
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
+
+@CacheableTask
+abstract class ClangSharedLibraryTask @Inject constructor(
+    private val workerExecutor: WorkerExecutor
+) : DefaultTask() {
+    init {
+        description = "Combines multiple object files (.o) into a shared library file" +
+            "(.so / .dylib)."
+        group = "Build"
+    }
+
+    @Suppress("UnstableApiUsage") // ServiceReference is incubating since 8.0
+    @get:ServiceReference(KonanBuildService.KEY)
+    abstract val konanBuildService: Property<KonanBuildService>
+
+    @get:Nested
+    abstract val clangParameters: ClangSharedLibraryParameters
+
+    @TaskAction
+    fun archive() {
+        workerExecutor.noIsolation().submit(
+            ClangSharedLibraryWorker::class.java
+        ) {
+            it.clangParameters.set(clangParameters)
+            it.buildService.set(konanBuildService)
+        }
+    }
+}
+
+abstract class ClangSharedLibraryParameters {
+    /**
+     * The target platform for the shared file.
+     */
+    @get:Input
+    abstract val konanTarget: Property<SerializableKonanTarget>
+
+    /**
+     * List of object files that will be added to the shared file output.
+     */
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.NAME_ONLY)
+    abstract val objectFiles: ConfigurableFileCollection
+
+    /**
+     * The final output file that will include the shared library containing the given
+     * [objectFiles].
+     */
+    @get:OutputFile
+    abstract val outputFile: RegularFileProperty
+
+    /**
+     * List of additional objects that will be dynamically linked with the output file. At runtime,
+     * these need to be available for the shared object output to work.
+     */
+    @get:InputFiles
+    @get:PathSensitive(PathSensitivity.NAME_ONLY)
+    abstract val linkedObjects: ConfigurableFileCollection
+}
+
+private abstract class ClangSharedLibraryWorker : WorkAction<ClangSharedLibraryWorker.Params> {
+    interface Params : WorkParameters {
+        val clangParameters: Property<ClangSharedLibraryParameters>
+        val buildService: Property<KonanBuildService>
+    }
+
+    override fun execute() {
+        val buildService = parameters.buildService.get()
+        buildService.createSharedLibrary(parameters.clangParameters.get())
+    }
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/clang/KonanBuildService.kt b/buildSrc/private/src/main/kotlin/androidx/build/clang/KonanBuildService.kt
new file mode 100644
index 0000000..94cb369
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/clang/KonanBuildService.kt
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.clang
+
+import androidx.build.getKonanPrebuiltsFolder
+import java.io.ByteArrayOutputStream
+import javax.inject.Inject
+import org.gradle.api.GradleException
+import org.gradle.api.Project
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.file.FileCollection
+import org.gradle.api.provider.Property
+import org.gradle.api.provider.Provider
+import org.gradle.api.services.BuildService
+import org.gradle.api.services.BuildServiceParameters
+import org.gradle.process.ExecOperations
+import org.gradle.process.ExecSpec
+import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader
+import org.jetbrains.kotlin.konan.target.Distribution
+import org.jetbrains.kotlin.konan.target.LinkerOutputKind
+import org.jetbrains.kotlin.konan.target.Platform
+import org.jetbrains.kotlin.konan.target.PlatformManager
+
+/**
+ * A Gradle BuildService that provides access to Konan Compiler (clang, linker, ar etc) to
+ * build native sources for multiple targets.
+ *
+ * You can obtain the instance via [obtain].
+ *
+ * @see ClangArchiveTask
+ * @see ClangCompileTask
+ * @see ClangSharedLibraryTask
+ */
+abstract class KonanBuildService @Inject constructor(
+    private val execOperations: ExecOperations
+) : BuildService<KonanBuildService.Parameters> {
+    private val dist by lazy {
+        Distribution(
+            konanHome = parameters.konanHome.get().asFile.absolutePath,
+            onlyDefaultProfiles = false,
+            propertyOverrides = mapOf(
+                "dependenciesUrl" to "file://${parameters.prebuilts.get().asFile}"
+            )
+        )
+    }
+
+    private val platformManager by lazy {
+        PlatformManager(distribution = dist)
+    }
+
+    /**
+     * @see ClangCompileTask
+     */
+    fun compile(parameters: ClangCompileParameters) {
+        val outputDir = parameters.output.get().asFile
+        outputDir.deleteRecursively()
+        outputDir.mkdirs()
+
+        val platform = getPlatform(parameters.konanTarget)
+        val additionalArgs = buildList {
+            addAll(parameters.freeArgs.get())
+            add("--compile")
+            parameters.includes.files.forEach { includeDirectory ->
+                check(includeDirectory.isDirectory) {
+                    "Include parameter for clang must be a directory"
+                }
+                add("-I${includeDirectory.canonicalPath}")
+            }
+            addAll(parameters.sources.regularFilePaths())
+        }
+
+        val clangCommand = platform.clang.clangC(
+            *additionalArgs.toTypedArray()
+        )
+        execOperations.executeSilently { execSpec ->
+            execSpec.executable = clangCommand.first()
+            execSpec.args(clangCommand.drop(1))
+            execSpec.workingDir = parameters.output.get().asFile
+        }
+    }
+
+    /**
+     * @see ClangArchiveTask
+     */
+    fun archiveLibrary(parameters: ClangArchiveParameters) {
+        val outputFile = parameters.outputFile.get().asFile
+        outputFile.delete()
+        outputFile.parentFile.mkdirs()
+
+        val platform = getPlatform(parameters.konanTarget)
+        val llvmArgs = buildList {
+            add("rc")
+            add(parameters.outputFile.get().asFile.canonicalPath)
+            addAll(parameters.objectFiles.regularFilePaths())
+        }
+        val commands = platform.clang.llvmAr(
+            *llvmArgs.toTypedArray()
+        )
+        execOperations.executeSilently { execSpec ->
+            execSpec.executable = commands.first()
+            execSpec.args(commands.drop(1))
+        }
+    }
+
+    /**
+     * @see ClangSharedLibraryTask
+     */
+    fun createSharedLibrary(parameters: ClangSharedLibraryParameters) {
+        val outputFile = parameters.outputFile.get().asFile
+        outputFile.delete()
+        outputFile.parentFile.mkdirs()
+
+        val platform = getPlatform(parameters.konanTarget)
+        val objectFiles = parameters.objectFiles.regularFilePaths()
+        val linkedObjectFiles = parameters.linkedObjects.regularFilePaths()
+        val linkCommands = platform.linker.finalLinkCommands(
+            objectFiles = objectFiles,
+            executable = outputFile.canonicalPath,
+            libraries = linkedObjectFiles,
+            linkerArgs = emptyList(),
+            optimize = true,
+            debug = false,
+            kind = LinkerOutputKind.DYNAMIC_LIBRARY,
+            outputDsymBundle = "unused",
+            needsProfileLibrary = false,
+            mimallocEnabled = false,
+            sanitizer = null
+        )
+        linkCommands.map { it.argsWithExecutable }.forEach { args ->
+            execOperations.executeSilently { execSpec ->
+                execSpec.executable = args.first()
+                args.drop(1).filterNot {
+                    // TODO b/305804211 Figure out if we would rather pass all args manually
+                    // We use the linker that konan uses to be as similar as possible but that
+                    // linker also has konan demangling, which we don't need and not even available
+                    // in the default distribution. Hence we remove that parameters.
+                    // In the future, we can consider not using the `platform.linker` but then
+                    // we would need to parse the konan.properties file to get the relevant
+                    // necessary parameters like sysroot etc.
+                    // https://github.com/JetBrains/kotlin/blob/master/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/KotlinNativeTest.kt#L536
+                    it.contains("--defsym") ||
+                        it.contains("Konan_cxa_demangle")
+                }.forEach {
+                    execSpec.args(it)
+                }
+            }
+        }
+    }
+
+    private fun FileCollection.regularFilePaths(): List<String> {
+        return files.flatMap {
+            it.walkTopDown().filter {
+                it.isFile
+            }.map { it.canonicalPath }
+        }.distinct()
+    }
+
+    private fun getPlatform(
+        serializableKonanTarget: Property<SerializableKonanTarget>
+    ): Platform {
+        val konanTarget = serializableKonanTarget.get().asKonanTarget
+        check(platformManager.enabled.contains(konanTarget)) {
+            "cannot find enabled target with name ${serializableKonanTarget.get()}"
+        }
+        val platform = platformManager.platform(konanTarget)
+        platform.downloadDependencies()
+        return platform
+    }
+
+    /**
+     * Execute the command without logs unless it fails.
+     */
+    private fun <T> ExecOperations.executeSilently(block: (ExecSpec) -> T) {
+        val outputStream = ByteArrayOutputStream()
+        val errorStream = ByteArrayOutputStream()
+        val execResult = exec {
+            block(it)
+            it.setErrorOutput(errorStream)
+            it.setStandardOutput(outputStream)
+            it.isIgnoreExitValue = true // we'll check it below
+        }
+        if (execResult.exitValue != 0) {
+            throw GradleException(
+                """
+                Compilation failed:
+                ==== output:
+                ${outputStream.toString(Charsets.UTF_8)}
+                ==== error:
+                ${errorStream.toString(Charsets.UTF_8)}
+            """.trimIndent()
+            )
+        }
+    }
+
+    interface Parameters : BuildServiceParameters {
+        val konanHome: DirectoryProperty
+        val prebuilts: DirectoryProperty
+    }
+
+    companion object {
+        internal const val KEY = "konanBuildService"
+        fun obtain(
+            project: Project
+        ): Provider<KonanBuildService> {
+            return project.gradle.sharedServices.registerIfAbsent(
+                KEY,
+                KonanBuildService::class.java
+            ) {
+                val nativeCompilerDownloader = NativeCompilerDownloader(project)
+                nativeCompilerDownloader.downloadIfNeeded()
+
+                it.parameters.konanHome.set(
+                    nativeCompilerDownloader.compilerDirectory
+                )
+                it.parameters.prebuilts.set(
+                    project.getKonanPrebuiltsFolder()
+                )
+            }
+        }
+    }
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/clang/SerializableKonanTarget.kt b/buildSrc/private/src/main/kotlin/androidx/build/clang/SerializableKonanTarget.kt
new file mode 100644
index 0000000..46fc49b
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/clang/SerializableKonanTarget.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.clang
+
+import java.io.Serializable
+import org.jetbrains.kotlin.konan.target.KonanTarget
+
+/**
+ * We cannot use KonanTarget as Gradle input/output due to
+ * https://youtrack.jetbrains.com/issue/KT-61657.
+ * Hence, we have this value class which represents it as a string.
+ */
+
+@JvmInline
+value class SerializableKonanTarget(val name: String) : Serializable {
+    init {
+        check(KonanTarget.predefinedTargets.contains(name)) {
+            "Invalid KonanTarget name: $name"
+        }
+    }
+
+    val asKonanTarget
+        get(): KonanTarget {
+            return KonanTarget.predefinedTargets[name] ?: error(
+                "No KonanTarget found with name $name"
+            )
+        }
+
+    override fun toString() = name
+
+    constructor(konanTarget: KonanTarget) : this(konanTarget.name)
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt b/buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
index cc96c2e..2361992 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
@@ -19,7 +19,7 @@
 import androidx.build.dependencyTracker.AffectedModuleDetector.Companion.ENABLE_ARG
 import androidx.build.getCheckoutRoot
 import androidx.build.getDistributionDirectory
-import androidx.build.gitclient.GitClient
+import androidx.build.gitclient.getChangedFilesProvider
 import androidx.build.gradle.isRoot
 import java.io.File
 import org.gradle.api.Action
@@ -57,14 +57,6 @@
 }
 
 /**
- * Provides the list of file paths (relative to the git root) that have changed (can include removed
- * files).
- *
- * Returns `null` if changed files cannot be detected.
- */
-typealias ChangedFilesProvider = () -> List<String>?
-
-/**
  * A utility class that can discover which files are changed based on git history.
  *
  * To enable this, you need to pass [ENABLE_ARG] into the build as a command line parameter
@@ -146,27 +138,25 @@
             if (baseCommitOverride != null) {
                 logger.info("using base commit override $baseCommitOverride")
             }
-            val changeInfoPath = GitClient.getChangeInfoPath(rootProject)
-            val manifestPath = GitClient.getManifestPath(rootProject)
             gradle.taskGraph.whenReady {
                 logger.lifecycle("projects evaluated")
                 val projectGraph = ProjectGraph(rootProject)
                 val dependencyTracker = DependencyTracker(rootProject, logger.toLogger())
                 val provider =
                     setupWithParams(
-                        rootProject,
-                        { spec ->
-                            val params = spec.parameters
-                            params.rootDir = rootProject.projectDir
-                            params.checkoutRoot = rootProject.getCheckoutRoot()
-                            params.projectGraph = projectGraph
-                            params.dependencyTracker = dependencyTracker
-                            params.log = logger
-                            params.baseCommitOverride = baseCommitOverride
-                            params.changeInfoPath = changeInfoPath
-                            params.manifestPath = manifestPath
-                        }
-                    )
+                        rootProject
+                    ) { spec ->
+                        val params = spec.parameters
+                        params.rootDir = rootProject.projectDir
+                        params.checkoutRoot = rootProject.getCheckoutRoot()
+                        params.projectGraph = projectGraph
+                        params.dependencyTracker = dependencyTracker
+                        params.log = logger
+                        params.baseCommitOverride = baseCommitOverride
+                        params.gitChangedFilesProvider = rootProject.getChangedFilesProvider(
+                            baseCommitOverride
+                        )
+                    }
                 logger.info("using real detector")
                 instance.wrapped = provider
             }
@@ -268,8 +258,7 @@
         var alwaysBuildIfExists: Set<String>?
         var ignoredPaths: Set<String>?
         var baseCommitOverride: String?
-        var changeInfoPath: Provider<String>
-        var manifestPath: Provider<String>
+        var gitChangedFilesProvider: Provider<List<String>>
     }
 
     val detector: AffectedModuleDetector by lazy {
@@ -277,26 +266,8 @@
         if (parameters.acceptAll) {
             AcceptAll(null)
         } else {
-            val baseCommitOverride = parameters.baseCommitOverride
-            if (baseCommitOverride != null) {
-                logger.info("using base commit override $baseCommitOverride")
-            }
-            val gitClient =
-                GitClient.create(
-                    projectDir = parameters.rootDir,
-                    checkoutRoot = parameters.checkoutRoot,
-                    logger = logger.toLogger(),
-                    changeInfoPath = parameters.changeInfoPath.get(),
-                    manifestPath = parameters.manifestPath.get()
-                )
-            val changedFilesProvider: ChangedFilesProvider = {
-                val baseSha = baseCommitOverride ?: gitClient.findPreviousSubmittedChange()
-                check(baseSha != null) {
-                    "gitClient returned null from findPreviousSubmittedChange"
-                }
-                val changedFiles = gitClient.findChangedFilesSince(baseSha)
-                logger.info("changed files: $changedFiles")
-                changedFiles
+            if (parameters.baseCommitOverride != null) {
+                logger.info("using base commit override ${parameters.baseCommitOverride}")
             }
 
             AffectedModuleDetectorImpl(
@@ -309,7 +280,7 @@
                     parameters.alwaysBuildIfExists
                         ?: AffectedModuleDetectorImpl.ALWAYS_BUILD_IF_EXISTS,
                 ignoredPaths = parameters.ignoredPaths ?: AffectedModuleDetectorImpl.IGNORED_PATHS,
-                changedFilesProvider = changedFilesProvider
+                changedFilesProvider = parameters.gitChangedFilesProvider
             )
         }
     }
@@ -335,8 +306,7 @@
  *
  * When a file in a module is changed, all modules that depend on it are considered as changed.
  */
-class AffectedModuleDetectorImpl
-constructor(
+class AffectedModuleDetectorImpl(
     private val projectGraph: ProjectGraph,
     private val dependencyTracker: DependencyTracker,
     logger: Logger?,
@@ -345,7 +315,7 @@
     private val cobuiltTestPaths: Set<Set<String>> = COBUILT_TEST_PATHS,
     private val alwaysBuildIfExists: Set<String> = ALWAYS_BUILD_IF_EXISTS,
     private val ignoredPaths: Set<String> = IGNORED_PATHS,
-    private val changedFilesProvider: ChangedFilesProvider
+    private val changedFilesProvider: Provider<List<String>>
 ) : AffectedModuleDetector(logger) {
 
     private val allProjects by lazy { projectGraph.allProjects }
@@ -356,7 +326,7 @@
 
     val dependentProjects by lazy { findDependentProjects() }
 
-    val alwaysBuild by lazy { alwaysBuildIfExists.filter({ path -> allProjects.contains(path) }) }
+    val alwaysBuild by lazy { alwaysBuildIfExists.filter { path -> allProjects.contains(path) } }
 
     private var unknownFiles: MutableSet<String> = mutableSetOf()
 
@@ -367,8 +337,6 @@
 
     private val cobuiltTestProjects by lazy { lookupProjectSetsFromPaths(cobuiltTestPaths) }
 
-    private val buildContainsNonProjectFileChanges by lazy { unknownFiles.isNotEmpty() }
-
     override fun shouldInclude(project: String): Boolean {
         return if (project == ":" || buildAll) {
             true
@@ -401,7 +369,7 @@
      * Returns allProjects if there are no previous merge CLs, which shouldn't happen.
      */
     private fun findChangedProjects(): Set<String> {
-        val changedFiles = changedFilesProvider() ?: return allProjects
+        val changedFiles = changedFilesProvider.getOrNull() ?: return allProjects
 
         val changedProjects: MutableSet<String> = alwaysBuild.toMutableSet()
 
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfo.kt b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfo.kt
new file mode 100644
index 0000000..211537d
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfo.kt
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.gitclient
+
+import androidx.build.getCheckoutRoot
+import androidx.build.parseXml
+import com.google.gson.Gson
+import java.io.File
+import org.gradle.api.GradleException
+import org.gradle.api.Project
+import org.gradle.api.provider.Provider
+
+/**
+ * A provider of changed files based on changeinfo files and manifest files created by the build
+ * server.
+ *
+ * For sample changeinfo config files, see: ChangeInfoProvidersTest.kt
+ * https://android-build.googleplex.com/builds/pending/P28356101/androidx_incremental/latest/incremental/P28356101-changeInfo
+ *
+ * For more information, see b/171569941
+ */
+fun Project.getChangedFilesFromChangeInfoProvider(
+    manifestPath: String,
+    changeInfoPath: String,
+    projectDirRelativeToRoot: String = projectDir.relativeTo(getCheckoutRoot()).toString()
+): Provider<List<String>> {
+    val manifestTextProvider = project.providers.fileContents(
+        project.objects.fileProperty().fileValue(File(manifestPath))
+    ).asText
+    return project.providers.fileContents(
+        project.objects.fileProperty().fileValue(File(changeInfoPath))
+    ).asText.zip(manifestTextProvider) { changeInfoText, manifestText ->
+        val fileList = mutableListOf<String>()
+        val fileSet = mutableSetOf<String>()
+        val gson = Gson()
+        val changeInfoEntries =
+            gson.fromJson(changeInfoText, ChangeInfo::class.java)
+        val projectName = computeProjectName(
+            projectDirRelativeToRoot,
+            manifestText
+        )
+        val changes = changeInfoEntries.changes?.filter { it.project == projectName } ?: emptyList()
+        for (change in changes) {
+            val revisions = change.revisions ?: listOf()
+            for (revision in revisions) {
+                val fileInfos = revision.fileInfos ?: listOf()
+                for (fileInfo in fileInfos) {
+                    fileInfo.oldPath?.let { path ->
+                        if (!fileSet.contains(path)) {
+                            fileList.add(path)
+                            fileSet.add(path)
+                        }
+                    }
+                    fileInfo.path?.let { path ->
+                        if (!fileSet.contains(path)) {
+                            fileList.add(path)
+                            fileSet.add(path)
+                        }
+                    }
+                }
+            }
+        }
+        return@zip fileList
+    }
+}
+
+// Data classes uses to parse CHANGE_INFO json files
+internal data class ChangeInfo(val changes: List<ChangeEntry>?)
+internal data class ChangeEntry(val project: String, val revisions: List<Revisions>?)
+internal data class Revisions(val fileInfos: List<FileInfo>?)
+internal data class FileInfo(val path: String?, val oldPath: String?, val status: String)
+
+/**
+ * A provider of HEAD SHA based on manifest file created by the build
+ * server.
+ *
+ * For sample manifest files, see: ChangeInfoProvidersTest.kt
+ *
+ * For more information, see b/171569941
+ */
+fun Project.getHeadShaFromManifestProvider(
+    manifestPath: String,
+    projectDirRelativeToRoot: String = projectDir.relativeTo(getCheckoutRoot()).toString()
+): Provider<String> {
+    val contentsProvider = project.providers.fileContents(
+        project.objects.fileProperty().fileValue(File(manifestPath))
+    )
+    return contentsProvider.asText.map { manifestContent ->
+        val projectName = computeProjectName(projectDirRelativeToRoot, manifestContent)
+        val revisionRegex = Regex("revision=\"([^\"]*)\"")
+        for (line in manifestContent.split("\n")) {
+            if (line.contains("name=\"${projectName}\"")) {
+                val result = revisionRegex.find(line)?.groupValues?.get(1)
+                if (result != null) {
+                    return@map result
+                }
+            }
+        }
+        throw GradleException(
+            "Could not identify version of project '$projectName' from config text" +
+                "'$manifestContent'"
+        )
+    }
+}
+
+private fun computeProjectName(projectPath: String, config: String): String {
+    fun pathContains(ancestor: String, child: String): Boolean {
+        return "$child/".startsWith("$ancestor/")
+    }
+    val document = parseXml(config, mapOf())
+    val projectIterator = document.rootElement.elementIterator()
+    while (projectIterator.hasNext()) {
+        val project = projectIterator.next()
+        val repositoryPath = project.attributeValue("path")
+        if (repositoryPath != null) {
+            if (pathContains(repositoryPath, projectPath)) {
+                val name = project.attributeValue("name")
+                check(name != null) { "Could not get name for project $project" }
+                return name
+            }
+        }
+    }
+    throw GradleException(
+        "Could not find project with path '$projectPath' in config"
+    )
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfoGitClient.kt b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfoGitClient.kt
deleted file mode 100644
index dba8e59..0000000
--- a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfoGitClient.kt
+++ /dev/null
@@ -1,148 +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.gitclient
-
-import androidx.build.parseXml
-import com.google.gson.Gson
-import org.gradle.api.GradleException
-
-/**
- * A git client based on changeinfo files and manifest files created by the build server.
- *
- * For sample changeinfo config files, see: ChangeInfoGitClientTest.kt
- * https://android-build.googleplex.com/builds/pending/P28356101/androidx_incremental/latest/incremental/P28356101-changeInfo
- *
- * For more information, see b/171569941
- */
-class ChangeInfoGitClient(
-    /** The file containing the information about which changes are new in this build */
-    changeInfoText: String,
-    /** The file containing version information */
-    private val versionInfo: String,
-    /**
-     * The project directory relative to the root of the checkout The repository is derived from
-     * this value
-     */
-    private val projectPath: String
-) : GitClient {
-
-    /**
-     * The name of the current git repository. In many cases this is 'platform/frameworks/support'
-     */
-    private val projectName: String by lazy { computeProjectName(versionInfo) }
-
-    private fun computeProjectName(config: String): String {
-        val document = parseXml(config, mapOf())
-        val projectIterator = document.rootElement.elementIterator()
-        while (projectIterator.hasNext()) {
-            val project = projectIterator.next()
-            val repositoryPath = project.attributeValue("path")
-            if (repositoryPath != null) {
-                if (pathContains(repositoryPath, projectPath)) {
-                    val name = project.attributeValue("name")
-                    check(name != null) { "Could not get name for project $project" }
-                    return name
-                }
-            }
-        }
-        throw GradleException(
-            "Could not find project with path '$projectPath' in config '$versionInfo'"
-        )
-    }
-
-    /** Object representing changes */
-    private val changeInfo: ChangeInfo by lazy {
-        val gson = Gson()
-        gson.fromJson(changeInfoText, ChangeInfo::class.java)
-    }
-
-    private data class ChangeInfo(val changes: List<ChangeEntry>?)
-
-    private data class ChangeEntry(val project: String, val revisions: List<Revisions>?)
-
-    private data class Revisions(val fileInfos: List<FileInfo>?)
-
-    private data class FileInfo(val path: String?, val oldPath: String?, val status: String)
-
-    private val changesInThisRepo: List<ChangeEntry>
-        get() {
-            return changeInfo.changes?.filter { it.project == projectName } ?: emptyList()
-        }
-
-    private fun extractVersion(config: String): String {
-        val revisionRegex = Regex("revision=\"([^\"]*)\"")
-        for (line in config.split("\n")) {
-            if (line.contains("name=\"${projectName}\"")) {
-                val result = revisionRegex.find(line)?.groupValues?.get(1)
-                if (result != null) {
-                    return result
-                }
-            }
-        }
-        throw GradleException(
-            "Could not identify version of project '$projectName' from config text '$config'"
-        )
-    }
-
-    /** Finds changed file paths */
-    override fun findChangedFilesSince(
-        sha: String // unused in this implementation, the data file knows what is new
-    ): List<String> {
-        val fileList = mutableListOf<String>()
-        val fileSet = mutableSetOf<String>()
-        for (change in changesInThisRepo) {
-            val revisions = change.revisions ?: listOf()
-            for (revision in revisions) {
-                val fileInfos = revision.fileInfos ?: listOf()
-                for (fileInfo in fileInfos) {
-                    fileInfo.oldPath?.let { path ->
-                        if (!fileSet.contains(path)) {
-                            fileList.add(path)
-                            fileSet.add(path)
-                        }
-                    }
-                    fileInfo.path?.let { path ->
-                        if (!fileSet.contains(path)) {
-                            fileList.add(path)
-                            fileSet.add(path)
-                        }
-                    }
-                }
-            }
-        }
-        return fileList
-    }
-
-    /**
-     * Unused If this were supported, it would: Finds the most recently submitted change before any
-     * pending changes being tested
-     */
-    override fun findPreviousSubmittedChange(): String {
-        // findChangedFilesSince doesn't need this information, so
-        // this is unsupported at the moment.
-        // For now we just return a non-null string to signify that there was no error
-        return ""
-    }
-
-    override fun getHeadSha(): String {
-        return extractVersion(versionInfo)
-    }
-}
-
-private fun pathContains(ancestor: String, child: String): Boolean {
-    return (child + "/").startsWith(ancestor + "/")
-}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitClient.kt b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitClient.kt
index 2b883ba..fca8225 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitClient.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitClient.kt
@@ -16,117 +16,133 @@
 
 package androidx.build.gitclient
 
-import androidx.build.getCheckoutRoot
+import androidx.build.gitclient.GitHeadShaSource.Parameters
+import java.io.ByteArrayOutputStream
 import java.io.File
-import java.util.concurrent.ConcurrentHashMap
+import java.nio.charset.Charset
+import javax.inject.Inject
 import org.gradle.api.GradleException
 import org.gradle.api.Project
-import org.gradle.api.logging.Logger
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.provider.Property
 import org.gradle.api.provider.Provider
+import org.gradle.api.provider.ValueSource
+import org.gradle.api.provider.ValueSourceParameters
+import org.gradle.process.ExecOperations
 
-interface GitClient {
-    fun findChangedFilesSince(sha: String): List<String>
-
-    fun findPreviousSubmittedChange(): String?
-
-    /** Returns the full commit sha for the HEAD of the git repository */
-    fun getHeadSha(): String
-
-    /** Abstraction for running execution commands for testability */
-    interface CommandRunner {
-        /** Executes the given shell command and returns the stdout as a string. */
-        fun execute(command: String): String
-        /** Executes the given shell command and returns the stdout by lines. */
-        fun executeAndParse(command: String): List<String>
-    }
-
-    companion object {
-        fun getChangeInfoPath(project: Project): Provider<String> {
-            return project.providers.environmentVariable("CHANGE_INFO").orElse("")
-        }
-
-        fun getManifestPath(project: Project): Provider<String> {
-            return project.providers.environmentVariable("MANIFEST").orElse("")
-        }
-
-        fun forProject(project: Project): GitClient {
-            return create(
-                project.projectDir,
-                project.getCheckoutRoot(),
-                project.logger,
-                GitClient.getChangeInfoPath(project).get(),
-                GitClient.getManifestPath(project).get()
-            )
-        }
-
-        fun create(
-            projectDir: File,
-            checkoutRoot: File,
-            logger: Logger,
-            changeInfoPath: String,
-            manifestPath: String
-        ): GitClient {
-            if (changeInfoPath != "") {
-                if (manifestPath == "") {
-                    throw GradleException("Setting CHANGE_INFO requires also setting MANIFEST")
-                }
-                val changeInfoFile = File(changeInfoPath)
-                val manifestFile = File(manifestPath)
-                if (!changeInfoFile.exists()) {
-                    throw GradleException("changeinfo file $changeInfoFile does not exist")
-                }
-                if (!manifestFile.exists()) {
-                    throw GradleException("manifest $manifestFile does not exist")
-                }
-                val changeInfoText = changeInfoFile.readText()
-                val manifestText = manifestFile.readText()
-                val projectDirRelativeToRoot = projectDir.relativeTo(checkoutRoot).toString()
-                logger.info(
-                    "Using ChangeInfoGitClient with change info path $changeInfoPath, " +
-                        "manifest $manifestPath project dir $projectDirRelativeToRoot"
-                )
-                return ChangeInfoGitClient(changeInfoText, manifestText, projectDirRelativeToRoot)
-            }
-            val gitRoot = findGitDirInParentFilepath(projectDir)
-            check(gitRoot != null) { "Could not find .git dir for $projectDir" }
-            logger.info("UsingGitRunnerGitClient")
-            return GitRunnerGitClient(gitRoot, logger)
+/**
+ * @return provider that has the changes files since the last merge commit. It will use CHANGE_INFO
+ * and MANIFEST to resolve the files if these environmental variables are set, otherwise it will
+ * default to using git.
+ *
+ * @param baseCommitOverride optional value to use to override last merge commit
+ */
+fun Project.getChangedFilesProvider(
+    baseCommitOverride: String?,
+): Provider<List<String>> {
+    val changeInfoPath = System.getenv("CHANGE_INFO")
+    val manifestPath = System.getenv("MANIFEST")
+    return if (changeInfoPath != null && manifestPath != null) {
+        if (baseCommitOverride != null) throw GradleException(
+            "Overriding base commit is not supported when using CHANGE_INFO and MANIFEST"
+        )
+        getChangedFilesFromChangeInfoProvider(manifestPath, changeInfoPath)
+    } else if (changeInfoPath != null) {
+        throw GradleException("Setting CHANGE_INFO requires also setting MANIFEST")
+    } else if (manifestPath != null) {
+        throw GradleException("Setting MANIFEST requires also setting CHANGE_INFO")
+    } else {
+        providers.of(GitChangedFilesSource::class.java) {
+            it.parameters.workingDir.set(rootProject.layout.projectDirectory)
+            it.parameters.baseCommitOverride.set(baseCommitOverride)
         }
     }
 }
 
-data class MultiGitClient(
-    val checkoutRoot: File,
-    val logger: Logger,
-    val changeInfoPath: String,
-    val manifestPath: String
-) {
-    // Map from the root of the git repository to a GitClient for that repository
-    // In AndroidX this directory could be frameworks/support, external/noto-fonts, or others
-    @Transient // We don't want Gradle to persist GitClient in the configuration cache
-    var cache: MutableMap<File, GitClient>? = null
-
-    fun getGitClient(projectDir: File): GitClient {
-        // If this object was restored from the Configuration cache, this value will be null
-        // So, if it is null we have to reinitialize it
-        var cache = this.cache
-        if (cache == null) {
-            cache = ConcurrentHashMap()
-            this.cache = cache
-        }
-        return cache.getOrPut(key = projectDir) {
-            GitClient.create(projectDir, checkoutRoot, logger, changeInfoPath, manifestPath)
+/**
+ * @return provider of HEAD SHA. It will use MANIFEST to get the SHA if the environmental variable
+ * is set, otherwise it will default to using git.
+ */
+fun getHeadShaProvider(project: Project): Provider<String> {
+    val manifestPath = System.getenv("MANIFEST")
+    return if (manifestPath != null) { // using manifest xml file for HEAD SHA
+        project.getHeadShaFromManifestProvider(manifestPath)
+    } else { // using git for HEAD SHA
+        project.providers.of(GitHeadShaSource::class.java) {
+            it.parameters.workingDir.set(project.layout.projectDirectory)
         }
     }
+}
 
-    companion object {
-        fun create(project: Project): MultiGitClient {
-            return MultiGitClient(
-                project.getCheckoutRoot(),
-                project.logger,
-                GitClient.getChangeInfoPath(project).get(),
-                GitClient.getManifestPath(project).get()
-            )
-        }
+/**
+ * Provides HEAD SHA by calling git in [Parameters.workingDir].
+ */
+internal abstract class GitHeadShaSource : ValueSource<String, GitHeadShaSource.Parameters> {
+    interface Parameters : ValueSourceParameters {
+        val workingDir: DirectoryProperty
     }
+
+    @get:Inject
+    abstract val execOperations: ExecOperations
+
+    override fun obtain(): String {
+        val output = ByteArrayOutputStream()
+        execOperations.exec {
+            it.commandLine("git", "rev-parse", "HEAD")
+            it.standardOutput = output
+            it.workingDir = findGitDirInParentFilepath(parameters.workingDir.get().asFile)
+        }
+        return String(output.toByteArray(), Charset.defaultCharset()).trim()
+    }
+}
+
+/**
+ * Provides changed files since the last merge by calling git in [Parameters.workingDir].
+ */
+internal abstract class GitChangedFilesSource :
+    ValueSource<List<String>, GitChangedFilesSource.Parameters> {
+    interface Parameters : ValueSourceParameters {
+        val workingDir: DirectoryProperty
+        val baseCommitOverride: Property<String?>
+    }
+
+    @get:Inject
+    abstract val execOperations: ExecOperations
+
+    override fun obtain(): List<String> {
+        val output = ByteArrayOutputStream()
+        val gitDirInParentFilepath = findGitDirInParentFilepath(parameters.workingDir.get().asFile)
+        val baseCommit = if (parameters.baseCommitOverride.isPresent) {
+            parameters.baseCommitOverride.get()
+        } else {
+            // Call git to get the last merge commit
+            execOperations.exec {
+                it.commandLine("git", "log", "-1", "--merges", "--oneline", "--pretty=format:%H")
+                it.standardOutput = output
+                it.workingDir = gitDirInParentFilepath
+            }
+            String(output.toByteArray(), Charset.defaultCharset()).trim()
+        }
+        // Get the list of changed files since the last git merge commit
+        execOperations.exec {
+            it.commandLine("git", "diff", "--name-only", "HEAD", baseCommit)
+            it.standardOutput = output
+            it.workingDir = gitDirInParentFilepath
+        }
+        return String(output.toByteArray(), Charset.defaultCharset()).split(
+            System.lineSeparator()
+        ).filterNot { it.isEmpty() }
+    }
+}
+
+/** Finds the git directory containing the given File by checking parent directories */
+private fun findGitDirInParentFilepath(filepath: File): File? {
+    var curDirectory: File = filepath
+    while (curDirectory.path != "/") {
+        if (File("$curDirectory/.git").exists()) {
+            return curDirectory
+        }
+        curDirectory = curDirectory.parentFile
+    }
+    return null
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitRunnerGitClient.kt b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitRunnerGitClient.kt
deleted file mode 100644
index 85b929d..0000000
--- a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitRunnerGitClient.kt
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.gitclient
-
-import java.io.File
-import java.util.concurrent.TimeUnit
-import org.gradle.api.logging.Logger
-
-/**
- * A simple git client that uses system process commands to communicate with the git setup in the
- * given working directory.
- */
-class GitRunnerGitClient(
-    /** The root location for git */
-    private val workingDir: File,
-    private val logger: Logger?,
-    private val commandRunner: GitClient.CommandRunner =
-        RealCommandRunner(workingDir = workingDir, logger = logger)
-) : GitClient {
-
-    /** Finds file paths changed in a commit since the given sha */
-    override fun findChangedFilesSince(sha: String): List<String> {
-        return commandRunner.executeAndParse("$CHANGED_FILES_CMD_PREFIX HEAD $sha")
-    }
-
-    /** checks the history to find the first merge CL. */
-    override fun findPreviousSubmittedChange(): String? {
-        return commandRunner
-            .executeAndParse(PREVIOUS_SUBMITTED_CMD)
-            .firstOrNull()
-            ?.split(" ")
-            ?.firstOrNull()
-    }
-
-    override fun getHeadSha(): String {
-        val gitLogCmd = "git log --name-only --pretty=format:%H HEAD -n 1 -- ./"
-        val gitLogString: String = commandRunner.execute(gitLogCmd)
-        if (gitLogString.isEmpty()) {
-            logger?.warn(
-                "No git commits found! Ran this command: '$gitLogCmd ' and received no output"
-            )
-        }
-        return gitLogString
-    }
-
-    private class RealCommandRunner(private val workingDir: File, private val logger: Logger?) :
-        GitClient.CommandRunner {
-        override fun execute(command: String): String {
-            val parts = command.split("\\s".toRegex())
-            logger?.info("running command $command in $workingDir")
-            val proc =
-                ProcessBuilder(*parts.toTypedArray())
-                    .directory(workingDir)
-                    .redirectOutput(ProcessBuilder.Redirect.PIPE)
-                    .redirectError(ProcessBuilder.Redirect.PIPE)
-                    .start()
-
-            // Read output, waiting for process to finish, as needed
-            val stdout = proc.inputStream.bufferedReader().readText()
-            val stderr = proc.errorStream.bufferedReader().readText()
-            val message = stdout + stderr
-            // wait potentially a little bit longer in case Git was waiting for us to
-            // read its response before it exited
-            proc.waitFor(10, TimeUnit.SECONDS)
-            logger?.info("Response: $message")
-            check(proc.exitValue() == 0) {
-                "Nonzero exit value running git command. Response: $message"
-            }
-            return stdout
-        }
-
-        override fun executeAndParse(command: String): List<String> {
-            return execute(command).split(System.lineSeparator()).filterNot { it.isEmpty() }
-        }
-    }
-
-    companion object {
-        const val PREVIOUS_SUBMITTED_CMD = "git log -1 --merges --oneline"
-        const val CHANGED_FILES_CMD_PREFIX = "git diff --name-only"
-    }
-}
-
-/** Finds the git directory containing the given File by checking parent directories */
-internal fun findGitDirInParentFilepath(filepath: File): File? {
-    var curDirectory: File = filepath
-    while (curDirectory.path != "/") {
-        if (File("$curDirectory/.git").exists()) {
-            return curDirectory
-        }
-        curDirectory = curDirectory.parentFile
-    }
-    return null
-}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/sbom/Sbom.kt b/buildSrc/private/src/main/kotlin/androidx/build/sbom/Sbom.kt
index 1f346f0..83186c0 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/sbom/Sbom.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/sbom/Sbom.kt
@@ -24,7 +24,7 @@
 import androidx.build.getDistributionDirectory
 import androidx.build.getPrebuiltsRoot
 import androidx.build.getSupportRootFolder
-import androidx.build.gitclient.MultiGitClient
+import androidx.build.gitclient.getHeadShaProvider
 import androidx.inspection.gradle.EXPORT_INSPECTOR_DEPENDENCIES
 import androidx.inspection.gradle.IMPORT_INSPECTOR_DEPENDENCIES
 import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
@@ -152,10 +152,14 @@
         }
     }
 
+    if (taskName == "stubAar") {
+        return listOf()
+    }
+
     throw GradleException(
         "Not sure which external dependencies are included in $projectPath:$taskName of type " +
             "${task::class.java} (this is used for publishing sboms). Please update " +
-            "AndroidXImplPlugin's listSbomConfigurationNamesForArchive and " +
+            "Sbom.kt's listSbomConfigurationNamesForArchive and " +
             "shouldSbomIncludeConfigurationName"
     )
 }
@@ -211,7 +215,7 @@
     }
     project.apply(plugin = "org.spdx.sbom")
     val repos = getRepoPublicUrls()
-    val gitsClient = MultiGitClient.create(project)
+    val headShaProvider = getHeadShaProvider(project)
     val supportRootDir = getSupportRootFolder()
 
     val allowPublicRepos = System.getenv("ALLOW_PUBLIC_REPOS") != null
@@ -262,10 +266,8 @@
                     original: ScmInfo,
                     projectInfo: ProjectInfo
                 ): ScmInfo {
-                    val gitClient = gitsClient.getGitClient(projectInfo.projectDirectory)
-                    val commit = gitClient.getHeadSha()
                     val url = getGitRemoteUrl(projectInfo.projectDirectory, supportRootDir)
-                    return ScmInfo.from("git", url, commit)
+                    return ScmInfo.from("git", url, headShaProvider.get())
                 }
 
                 override fun shouldCreatePackageForProject(projectInfo: ProjectInfo): Boolean {
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt b/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
index b51596da..a3a8978 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
@@ -114,8 +114,6 @@
         ":external:libyuv:buildCMakeRelWithDebInfo[arm64-v8a][yuv]",
         ":external:libyuv:buildCMakeRelWithDebInfo[x86][yuv]",
         ":external:libyuv:buildCMakeRelWithDebInfo[x86_64][yuv]",
-        ":hilt:hilt-navigation-compose:kaptGenerateStubsDebugKotlin",
-        ":hilt:hilt-navigation-compose:kaptGenerateStubsReleaseKotlin",
         ":lint-checks:integration-tests:copyDebugAndroidLintReports",
 
         // https://youtrack.jetbrains.com/issue/KT-49933
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/AndroidXConfig.kt b/buildSrc/public/src/main/kotlin/androidx/build/AndroidXConfig.kt
index 04a99a9..d92ea49 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/AndroidXConfig.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/AndroidXConfig.kt
@@ -28,7 +28,7 @@
 
     override val compileSdk: String by lazy { project.findProperty(COMPILE_SDK_VERSION).toString() }
 
-    override val minSdk: Int = 14
+    override val minSdk: Int = 19
     override val ndkVersion: String = "23.1.7779620"
 
     override val targetSdk: Int by lazy {
diff --git a/busytown/impl/build-studio-and-androidx.sh b/busytown/impl/build-studio-and-androidx.sh
index 420bf5f..eff5aa5 100755
--- a/busytown/impl/build-studio-and-androidx.sh
+++ b/busytown/impl/build-studio-and-androidx.sh
@@ -111,9 +111,9 @@
 
 function buildAndroidx() {
   RETURN_CODE=0
-  LOG_PROCESSOR="$SCRIPTS_DIR/../development/build_log_processor.sh"
   # Remove -Pandroid.overrideVersionCheck=true once we upgrade to Gradle 8.1
-  if "$LOG_PROCESSOR" frameworks/support/gradlew -p frameworks/support $androidxArguments --profile \
+  if frameworks/support/gradlew -p frameworks/support $androidxArguments --profile \
+    -Pandroidx.summarizeStderr\
     --dependency-verification=off -Pandroid.overrideVersionCheck=true -Pandroidx.highMemory; then
     echo build passed
   else
diff --git a/busytown/impl/build.sh b/busytown/impl/build.sh
index 7821341..3fba732 100755
--- a/busytown/impl/build.sh
+++ b/busytown/impl/build.sh
@@ -20,9 +20,9 @@
 export DIST_DIR="$DIST_DIR"
 if [ "$CHANGE_INFO" != "" ]; then
   cp "$CHANGE_INFO" "$DIST_DIR/"
-fi
-if [ "$MANIFEST" == "" ]; then
-  export MANIFEST="$DIST_DIR/manifest_${BUILD_NUMBER}.xml"
+  if [ "$MANIFEST" == "" ]; then
+    export MANIFEST="$DIST_DIR/manifest_${BUILD_NUMBER}.xml"
+  fi
 fi
 
 # parse arguments
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/GuaranteedConfigurationsUtil.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/GuaranteedConfigurationsUtil.kt
index c0fe1de..6765858 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/GuaranteedConfigurationsUtil.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/GuaranteedConfigurationsUtil.kt
@@ -17,6 +17,8 @@
 package androidx.camera.camera2.pipe.integration.adapter
 
 import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CameraMetadata
+import android.os.Build
 import androidx.annotation.RequiresApi
 import androidx.camera.core.impl.SurfaceCombination
 import androidx.camera.core.impl.SurfaceConfig
@@ -768,6 +770,235 @@
         )
     }
 
+    /**
+     * Returns the entire supported stream combinations for devices with Stream Use Case capability
+     */
+    @RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
+    fun getStreamUseCaseSupportedCombinationList(): List<SurfaceCombination> {
+        return listOf<SurfaceCombination>(
+            // (PRIV, s1440p, PREVIEW_VIDEO_STILL)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.s1440p,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL
+                            .toLong()
+                    )
+                )
+            },
+            // (YUV, s1440p, PREVIEW_VIDEO_STILL)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.YUV, ConfigSize.s1440p,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL
+                            .toLong()
+                    )
+                )
+            },
+            // (PRIV, RECORD, VIDEO_RECORD)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.RECORD,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+                    )
+                )
+            },
+            // (YUV, RECORD, VIDEO_RECORD)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.YUV,
+                        ConfigSize.RECORD,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+                    )
+                )
+            },
+            // (JPEG, MAXIMUM, STILL_CAPTURE)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.JPEG,
+                        ConfigSize.MAXIMUM,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+                    )
+                )
+            },
+            // (YUV, MAXIMUM, STILL_CAPTURE)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.YUV,
+                        ConfigSize.MAXIMUM,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+                    )
+                )
+            },
+            // (PRIV, PREVIEW, PREVIEW) + (JPEG, MAXIMUM, STILL_CAPTURE)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.JPEG,
+                        ConfigSize.MAXIMUM,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+                    )
+                )
+            },
+            // (PRIV, PREVIEW, PREVIEW) + (YUV, MAXIMUM, STILL_CAPTURE)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.YUV,
+                        ConfigSize.MAXIMUM,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+                    )
+                )
+            },
+            // (PRIV, PREVIEW, PREVIEW) + (PRIV, RECORD, VIDEO_RECORD)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.RECORD,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+                    )
+                )
+            },
+            // (PRIV, PREVIEW, PREVIEW) + (YUV, RECORD, VIDEO_RECORD)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.YUV,
+                        ConfigSize.RECORD,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+                    )
+                )
+            },
+            // (PRIV, PREVIEW, PREVIEW) + (YUV, PREVIEW, PREVIEW)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.YUV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+            },
+            // (PRIV, PREVIEW, PREVIEW) + (PRIV, RECORD, VIDEO_RECORD) +
+            // (JPEG, RECORD, STILL_CAPTURE)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.RECORD,
+                        CameraMetadata.CONTROL_CAPTURE_INTENT_VIDEO_RECORD.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.JPEG,
+                        ConfigSize.RECORD,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+                    )
+                )
+            },
+            // (PRIV, PREVIEW, PREVIEW) + (YUV, RECORD, VIDEO_RECORD) +
+            // (JPEG, RECORD, STILL_CAPTURE)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.YUV,
+                        ConfigSize.RECORD,
+                        CameraMetadata.CONTROL_CAPTURE_INTENT_VIDEO_RECORD.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.JPEG,
+                        ConfigSize.RECORD,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+                    )
+                )
+            },
+            // (PRIV, PREVIEW, PREVIEW) + (YUV, PREVIEW, PREVIEW) + (JPEG, MAXIMUM, STILL_CAPTURE)
+            SurfaceCombination().apply {
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.PRIV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.YUV,
+                        ConfigSize.PREVIEW,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                    )
+                )
+                addSurfaceConfig(
+                    SurfaceConfig.create(
+                        ConfigType.JPEG,
+                        ConfigSize.MAXIMUM,
+                        CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+                    )
+                )
+            },
+        )
+    }
+
     @JvmStatic
     fun getPreviewStabilizationSupportedCombinationList(): List<SurfaceCombination> {
         val combinationList: MutableList<SurfaceCombination> = ArrayList()
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapter.kt
index 09ea465..ab945d4 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapter.kt
@@ -26,14 +26,15 @@
 import androidx.camera.camera2.pipe.core.Log
 import androidx.camera.camera2.pipe.core.Log.debug
 import androidx.camera.camera2.pipe.integration.impl.Camera2ImplConfig
-import androidx.camera.camera2.pipe.integration.impl.STREAM_USE_CASE_OPTION
 import androidx.camera.camera2.pipe.integration.impl.STREAM_USE_HINT_OPTION
+import androidx.camera.camera2.pipe.integration.internal.StreamUseCaseUtil
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.DeferrableSurface
 import androidx.camera.core.impl.SessionConfig
+import androidx.camera.core.impl.UseCaseConfig
 import androidx.camera.core.streamsharing.StreamSharing
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
@@ -48,10 +49,12 @@
 ) {
     val surfaceToStreamUseCaseMap: Map<DeferrableSurface, Long> by lazy {
         val sessionConfigs = mutableListOf<SessionConfig>()
+        val useCaseConfigs = mutableListOf<UseCaseConfig<*>>()
         for (useCase in useCases) {
             sessionConfigs.add(useCase.sessionConfig)
+            useCaseConfigs.add(useCase.currentConfig)
         }
-        getSurfaceToStreamUseCaseMapping(sessionConfigs, shouldSetStreamUseCaseByDefault = false)
+        getSurfaceToStreamUseCaseMapping(sessionConfigs, useCaseConfigs)
     }
     val surfaceToStreamUseHintMap: Map<DeferrableSurface, Long> by lazy {
         val sessionConfigs = useCases.map { it.sessionConfig }
@@ -118,7 +121,7 @@
     @VisibleForTesting
     fun getSurfaceToStreamUseCaseMapping(
         sessionConfigs: Collection<SessionConfig>,
-        shouldSetStreamUseCaseByDefault: Boolean
+        useCaseConfigs: Collection<UseCaseConfig<*>>,
     ): Map<DeferrableSurface, Long> {
         if (sessionConfigs.any { it.templateType == CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG }) {
             // If is ZSL, do not populate anything.
@@ -127,32 +130,12 @@
         }
 
         val mapping = mutableMapOf<DeferrableSurface, Long>()
-        for (sessionConfig in sessionConfigs) {
-            if (sessionConfig.templateType == CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG) {
-                // If is ZSL, stream use case is ignored.
-                Log.info { "ZSL in populateSurfaceToStreamUseCaseMapping()" }
-                return emptyMap()
-            }
+        StreamUseCaseUtil.populateSurfaceToStreamUseCaseMapping(
+            sessionConfigs,
+            useCaseConfigs,
+            mapping
+        )
 
-            for (surface in sessionConfig.surfaces) {
-                if (sessionConfig.implementationOptions.containsOption(STREAM_USE_CASE_OPTION) &&
-                    sessionConfig.implementationOptions.retrieveOption(STREAM_USE_CASE_OPTION)
-                    != null
-                ) {
-                    mapping[surface] =
-                        sessionConfig.implementationOptions
-                            .retrieveOption(STREAM_USE_CASE_OPTION)!!
-                    continue
-                }
-
-                if (shouldSetStreamUseCaseByDefault) {
-                    // TODO(b/266879290) This is currently gated out because of camera device
-                    // crashing due to unsupported stream useCase combinations.
-                    val streamUseCase = getStreamUseCaseForContainerClass(surface.containerClass)
-                    mapping[surface] = streamUseCase
-                }
-            }
-        }
         return mapping
     }
 
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombination.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombination.kt
index 63c187f..c33ecee 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombination.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombination.kt
@@ -41,6 +41,7 @@
 import androidx.camera.camera2.pipe.integration.compat.workaround.TargetAspectRatio
 import androidx.camera.camera2.pipe.integration.impl.DisplayInfoManager
 import androidx.camera.camera2.pipe.integration.internal.DynamicRangeResolver
+import androidx.camera.camera2.pipe.integration.internal.StreamUseCaseUtil
 import androidx.camera.core.DynamicRange
 import androidx.camera.core.impl.AttachedSurfaceInfo
 import androidx.camera.core.impl.CameraMode
@@ -90,6 +91,7 @@
             ?: CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES
     private val concurrentSurfaceCombinations: MutableList<SurfaceCombination> = mutableListOf()
     private val surfaceCombinations: MutableList<SurfaceCombination> = mutableListOf()
+    private val surfaceCombinationsStreamUseCase: MutableList<SurfaceCombination> = mutableListOf()
     private val ultraHighSurfaceCombinations: MutableList<SurfaceCombination> = mutableListOf()
     private val previewStabilizationSurfaceCombinations: MutableList<SurfaceCombination> =
         mutableListOf()
@@ -99,6 +101,7 @@
     private var isRawSupported = false
     private var isBurstCaptureSupported = false
     private var isConcurrentCameraModeSupported = false
+    private var isStreamUseCaseSupported = false
     private var isUltraHighResolutionSensorSupported = false
     private var isPreviewStabilizationSupported = false
     internal lateinit var surfaceSizeDefinition: SurfaceSizeDefinition
@@ -130,6 +133,12 @@
         if (isPreviewStabilizationSupported) {
             generatePreviewStabilizationSupportedCombinationList()
         }
+
+        isStreamUseCaseSupported = StreamUseCaseUtil.isStreamUseCaseSupported(cameraMetadata)
+        if (isStreamUseCaseSupported) {
+            generateStreamUseCaseSupportedCombinationList()
+        }
+
         generateSurfaceSizeDefinition()
     }
 
@@ -151,6 +160,24 @@
         }
     }
 
+    private fun getOrderedSupportedStreamUseCaseSurfaceConfigList(
+        featureSettings: FeatureSettings,
+        surfaceConfigList: List<SurfaceConfig?>?
+    ): List<SurfaceConfig>? {
+        if (!StreamUseCaseUtil.shouldUseStreamUseCase(featureSettings)) {
+            return null
+        }
+        for (surfaceCombination in surfaceCombinationsStreamUseCase) {
+            val orderedSurfaceConfigList = surfaceCombination.getOrderedSupportedSurfaceConfigList(
+                surfaceConfigList!!
+            )
+            if (orderedSurfaceConfigList != null) {
+                return orderedSurfaceConfigList
+            }
+        }
+        return null
+    }
+
     /**
      * Returns the supported surface combinations according to the specified feature
      * settings.
@@ -244,8 +271,10 @@
             newUseCaseConfigs, useCasesPriorityOrder
         )
         val requiredMaxBitDepth: Int = getRequiredMaxBitDepth(resolvedDynamicRanges)
-        val featureSettings = FeatureSettings(cameraMode, requiredMaxBitDepth,
-            isPreviewStabilizationOn)
+        val featureSettings = FeatureSettings(
+            cameraMode, requiredMaxBitDepth,
+            isPreviewStabilizationOn
+        )
         require(
             !(cameraMode != CameraMode.DEFAULT &&
                 requiredMaxBitDepth == DynamicRange.BIT_DEPTH_10_BIT)
@@ -268,38 +297,199 @@
             )
         }
 
-        if (!checkSupported(featureSettings, surfaceConfigs)) {
-            throw java.lang.IllegalArgumentException(
-                "No supported surface combination is found for camera device - Id : " + cameraId +
-                    ".  May be attempting to bind too many use cases. " + "Existing surfaces: " +
-                    attachedSurfaces + " New configs: " + newUseCaseConfigs
+        val containsZsl: Boolean = StreamUseCaseUtil.containsZslUseCase(
+            attachedSurfaces,
+            newUseCaseConfigs
+        )
+        var orderedSurfaceConfigListForStreamUseCase: List<SurfaceConfig>? =
+            if (isStreamUseCaseSupported && !containsZsl)
+                getOrderedSupportedStreamUseCaseSurfaceConfigList(
+                    featureSettings,
+                    surfaceConfigs
+                ) else null
+
+        val isSurfaceCombinationSupported = checkSupported(featureSettings, surfaceConfigs)
+
+        require(
+            !(orderedSurfaceConfigListForStreamUseCase == null &&
+                !isSurfaceCombinationSupported)
+        ) {
+            "No supported surface combination is found for camera device - Id : $cameraId. " +
+                "May be attempting to bind too many use cases. Existing surfaces: " +
+                "$attachedSurfaces. New configs: $newUseCaseConfigs."
+        }
+        // The two maps are used to keep track of the attachedSurfaceInfo or useCaseConfigs the
+        // surfaceConfigs are made from. They are populated in getSurfaceConfigListAndFpsCeiling().
+        // The keys are the position of their corresponding surfaceConfigs in the list. We can
+        // them map streamUseCases in orderedSurfaceConfigListForStreamUseCase, which is in the
+        // same order as surfaceConfigs list, to the original useCases to determine the
+        // captureTypes are correct.
+        val surfaceConfigIndexAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo> =
+            mutableMapOf()
+        val surfaceConfigIndexUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>> = mutableMapOf()
+        val allPossibleSizeArrangements = getAllPossibleSizeArrangements(
+            getSupportedOutputSizesList(
+                newUseCaseConfigsSupportedSizeMap,
+                newUseCaseConfigs,
+                useCasesPriorityOrder
+            )
+        )
+
+        if (orderedSurfaceConfigListForStreamUseCase != null) {
+            orderedSurfaceConfigListForStreamUseCase = getOrderedSurfaceConfigListForStreamUseCase(
+                allPossibleSizeArrangements,
+                attachedSurfaces,
+                newUseCaseConfigs,
+                useCasesPriorityOrder,
+                featureSettings,
+                isSurfaceCombinationSupported,
+                surfaceConfigIndexAttachedSurfaceInfoMap,
+                surfaceConfigIndexUseCaseConfigMap
             )
         }
 
         val targetFpsRange =
             getTargetFpsRange(attachedSurfaces, newUseCaseConfigs, useCasesPriorityOrder)
         val maxSupportedFps = getMaxSupportedFps(attachedSurfaces)
-
         val bestSizesAndFps = findBestSizesAndFps(
-            newUseCaseConfigsSupportedSizeMap,
+            allPossibleSizeArrangements,
             attachedSurfaces,
             newUseCaseConfigs,
             maxSupportedFps,
             useCasesPriorityOrder,
             targetFpsRange,
-            featureSettings
+            featureSettings,
+            orderedSurfaceConfigListForStreamUseCase
         )
 
         val suggestedStreamSpecMap = generateSuggestedStreamSpecMap(
-            bestSizesAndFps.first,
+            bestSizesAndFps,
             targetFpsRange,
-            bestSizesAndFps.second,
             newUseCaseConfigs,
             useCasesPriorityOrder,
             resolvedDynamicRanges,
         )
+        val attachedSurfaceStreamSpecMap = mutableMapOf<AttachedSurfaceInfo, StreamSpec>()
 
-        return Pair.create(suggestedStreamSpecMap, mapOf<AttachedSurfaceInfo, StreamSpec>())
+        populateStreamUseCaseIfSameSavedSizes(
+            bestSizesAndFps,
+            orderedSurfaceConfigListForStreamUseCase,
+            attachedSurfaces,
+            attachedSurfaceStreamSpecMap,
+            suggestedStreamSpecMap,
+            surfaceConfigIndexAttachedSurfaceInfoMap,
+            surfaceConfigIndexUseCaseConfigMap
+        )
+
+        return Pair.create(suggestedStreamSpecMap, attachedSurfaceStreamSpecMap)
+    }
+
+    /**
+     * Iterate through all possible size arrangement and returns a surfaceConfig list for stream
+     * use case. This list is ordered and the indices of its items are stored into
+     * surfaceConfigIndexAttachedSurfaceInfoMap and surfaceConfigIndexUseCaseConfigMap.
+     */
+    private fun getOrderedSurfaceConfigListForStreamUseCase(
+        allPossibleSizeArrangements: List<MutableList<Size>>,
+        attachedSurfaces: List<AttachedSurfaceInfo>,
+        newUseCaseConfigs: List<UseCaseConfig<*>>,
+        useCasesPriorityOrder: List<Int>,
+        featureSettings: FeatureSettings,
+        isSurfaceCombinationSupported: Boolean,
+        surfaceConfigIndexAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo>,
+        surfaceConfigIndexUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>>
+    ): List<SurfaceConfig>? {
+        var orderedSurfaceConfigListForStreamUseCase: List<SurfaceConfig>? = null
+        // Check if any possible size arrangement is supported for stream use case.
+        for (possibleSizeList in allPossibleSizeArrangements) {
+            val surfaceConfigs = getSurfaceConfigList(
+                featureSettings.cameraMode,
+                attachedSurfaces, possibleSizeList, newUseCaseConfigs,
+                useCasesPriorityOrder,
+                surfaceConfigIndexAttachedSurfaceInfoMap,
+                surfaceConfigIndexUseCaseConfigMap
+            )
+            orderedSurfaceConfigListForStreamUseCase =
+                getOrderedSupportedStreamUseCaseSurfaceConfigList(
+                    featureSettings,
+                    surfaceConfigs
+                )
+            if (orderedSurfaceConfigListForStreamUseCase != null &&
+                !StreamUseCaseUtil.areCaptureTypesEligible(
+                    surfaceConfigIndexAttachedSurfaceInfoMap,
+                    surfaceConfigIndexUseCaseConfigMap,
+                    orderedSurfaceConfigListForStreamUseCase
+                )
+            ) {
+                orderedSurfaceConfigListForStreamUseCase = null
+            }
+            if (orderedSurfaceConfigListForStreamUseCase != null) {
+                orderedSurfaceConfigListForStreamUseCase =
+                    if (StreamUseCaseUtil.areStreamUseCasesAvailableForSurfaceConfigs(
+                            cameraMetadata, orderedSurfaceConfigListForStreamUseCase
+                        )
+                    ) {
+                        break
+                    } else {
+                        null
+                    }
+            }
+            surfaceConfigIndexAttachedSurfaceInfoMap.clear()
+            surfaceConfigIndexUseCaseConfigMap.clear()
+        }
+
+        // We can terminate early if surface combination is not supported and none of the
+        // possible size arrangement supports stream use case either.
+        require(
+            !(orderedSurfaceConfigListForStreamUseCase == null &&
+                !isSurfaceCombinationSupported)
+        ) {
+            "No supported surface combination is found for camera device - Id : $cameraId. " +
+                "May be attempting to bind too many use cases. Existing surfaces: " +
+                "$attachedSurfaces. New configs: $newUseCaseConfigs."
+        }
+        return orderedSurfaceConfigListForStreamUseCase
+    }
+
+    /**
+     * If the saved max FPS and sizes are the same for non-streamUseCase and streamUseCase, populate
+     * stream use case values into the output streamSpecs in attachedSurfaceStreamSpecMap and
+     * suggestedStreamSpecMap.
+     */
+    private fun populateStreamUseCaseIfSameSavedSizes(
+        bestSizesAndMaxFps: BestSizesAndMaxFpsForConfigs,
+        orderedSurfaceConfigListForStreamUseCase: List<SurfaceConfig>?,
+        attachedSurfaces: List<AttachedSurfaceInfo>,
+        attachedSurfaceStreamSpecMap: MutableMap<AttachedSurfaceInfo, StreamSpec>,
+        suggestedStreamSpecMap: MutableMap<UseCaseConfig<*>, StreamSpec>,
+        surfaceConfigIndexAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo>,
+        surfaceConfigIndexUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>>
+    ) {
+        // Only perform stream use case operations if the saved max FPS and sizes are the same
+        if (orderedSurfaceConfigListForStreamUseCase != null &&
+            bestSizesAndMaxFps.maxFps == bestSizesAndMaxFps.maxFpsForStreamUseCase &&
+            bestSizesAndMaxFps.bestSizes.size == bestSizesAndMaxFps.bestSizesForStreamUseCase!!.size
+        ) {
+            var hasDifferentSavedSizes =
+                bestSizesAndMaxFps.bestSizes.zip(bestSizesAndMaxFps.bestSizesForStreamUseCase)
+                    .any { it.first != it.second }
+            if (!hasDifferentSavedSizes) {
+                val hasStreamUseCaseOverride: Boolean =
+                    StreamUseCaseUtil.populateStreamUseCaseStreamSpecOptionWithInteropOverride(
+                        cameraMetadata, attachedSurfaces, suggestedStreamSpecMap,
+                        attachedSurfaceStreamSpecMap
+                    )
+                if (!hasStreamUseCaseOverride) {
+                    StreamUseCaseUtil
+                        .populateStreamUseCaseStreamSpecOptionWithSupportedSurfaceConfigs(
+                            suggestedStreamSpecMap, attachedSurfaceStreamSpecMap,
+                            surfaceConfigIndexAttachedSurfaceInfoMap,
+                            surfaceConfigIndexUseCaseConfigMap,
+                            orderedSurfaceConfigListForStreamUseCase
+                        )
+                }
+            }
+        }
     }
 
     private fun getSupportedOutputSizesList(
@@ -359,30 +549,29 @@
     }
 
     private fun findBestSizesAndFps(
-        newUseCaseConfigsSupportedSizeMap: Map<UseCaseConfig<*>, List<Size>>,
+        allPossibleSizeArrangements: List<MutableList<Size>>,
         attachedSurfaces: List<AttachedSurfaceInfo>,
         newUseCaseConfigs: List<UseCaseConfig<*>>,
         existingSurfaceFrameRateCeiling: Int,
         useCasesPriorityOrder: List<Int>,
         targetFrameRateForConfig: Range<Int>?,
-        featureSettings: FeatureSettings
-    ): Pair<List<Size>, Int> {
+        featureSettings: FeatureSettings,
+        orderedSurfaceConfigListForStreamUseCase: List<SurfaceConfig>?
+    ): BestSizesAndMaxFpsForConfigs {
         var bestSizes: List<Size>? = null
-        var bestConfigMaxFps = Int.MAX_VALUE
-        val allPossibleSizeArrangements = getAllPossibleSizeArrangements(
-            getSupportedOutputSizesList(
-                newUseCaseConfigsSupportedSizeMap,
-                newUseCaseConfigs,
-                useCasesPriorityOrder
-            )
-        )
+        var maxFps = Int.MAX_VALUE
+        var bestSizesForStreamUseCase: List<Size>? = null
+        var maxFpsForStreamUseCase = Int.MAX_VALUE
+        var supportedSizesFound = false
+        var supportedSizesForStreamUseCaseFound = false
+
         // Transform use cases to SurfaceConfig list and find the first (best) workable combination
         for (possibleSizeList in allPossibleSizeArrangements) {
             // Attach SurfaceConfig of original use cases since it will impact the new use cases
             val surfaceConfigList = getSurfaceConfigList(
                 featureSettings.cameraMode,
                 attachedSurfaces, possibleSizeList, newUseCaseConfigs,
-                useCasesPriorityOrder
+                useCasesPriorityOrder, null, null
             )
             val currentConfigFrameRateCeiling = getCurrentConfigFrameRateCeiling(
                 possibleSizeList, newUseCaseConfigs,
@@ -401,24 +590,57 @@
                 }
             }
 
+            // Find the same possible size arrangement that is supported by stream use case again
+            // if we found one earlier.
+
             // only change the saved config if you get another that has a better max fps
-            if (checkSupported(featureSettings, surfaceConfigList)) {
-                // if we have a configuration where the max fps is acceptable for our target, break
-                if (isConfigFrameRateAcceptable) {
-                    bestConfigMaxFps = currentConfigFrameRateCeiling
-                    bestSizes = possibleSizeList
-                    break
-                }
+            if (!supportedSizesFound && checkSupported(featureSettings, surfaceConfigList)) {
                 // if the config is supported by the device but doesn't meet the target frame rate,
                 // save the config
-                if (bestConfigMaxFps == Int.MAX_VALUE) {
-                    bestConfigMaxFps = currentConfigFrameRateCeiling
+                if (maxFps == Int.MAX_VALUE) {
+                    maxFps = currentConfigFrameRateCeiling
                     bestSizes = possibleSizeList
-                } else if (bestConfigMaxFps < currentConfigFrameRateCeiling) {
+                } else if (maxFps < currentConfigFrameRateCeiling) {
                     // only change the saved config if the max fps is better
-                    bestConfigMaxFps = currentConfigFrameRateCeiling
+                    maxFps = currentConfigFrameRateCeiling
                     bestSizes = possibleSizeList
                 }
+
+                // if we have a configuration where the max fps is acceptable for our target, break
+                if (isConfigFrameRateAcceptable) {
+                    maxFps = currentConfigFrameRateCeiling
+                    bestSizes = possibleSizeList
+                    supportedSizesFound = true
+                    if (supportedSizesForStreamUseCaseFound) {
+                        break
+                    }
+                }
+            }
+            // If we already know that there is a supported surface combination from the stream
+            // use case table, keep an independent tracking on the saved sizes and max FPS. Only
+            // use stream use case if the save sizes for the normal case and for stream use case
+            // are the same.
+            if (orderedSurfaceConfigListForStreamUseCase != null &&
+                !supportedSizesForStreamUseCaseFound &&
+                getOrderedSupportedStreamUseCaseSurfaceConfigList(
+                    featureSettings, surfaceConfigList
+                ) != null
+            ) {
+                if (maxFpsForStreamUseCase == Int.MAX_VALUE) {
+                    maxFpsForStreamUseCase = currentConfigFrameRateCeiling
+                    bestSizesForStreamUseCase = possibleSizeList
+                } else if (maxFpsForStreamUseCase < currentConfigFrameRateCeiling) {
+                    maxFpsForStreamUseCase = currentConfigFrameRateCeiling
+                    bestSizesForStreamUseCase = possibleSizeList
+                }
+                if (isConfigFrameRateAcceptable) {
+                    maxFpsForStreamUseCase = currentConfigFrameRateCeiling
+                    bestSizesForStreamUseCase = possibleSizeList
+                    supportedSizesForStreamUseCaseFound = true
+                    if (supportedSizesFound) {
+                        break
+                    }
+                }
             }
         }
         require(bestSizes != null) {
@@ -427,33 +649,43 @@
                 "May be the specified resolution is too large and not supported. " +
                 "Existing surfaces: $attachedSurfaces. New configs: $newUseCaseConfigs."
         }
-        return Pair(bestSizes, bestConfigMaxFps)
+        return BestSizesAndMaxFpsForConfigs(
+            bestSizes,
+            bestSizesForStreamUseCase,
+            maxFps,
+            maxFpsForStreamUseCase
+        )
     }
 
     private fun generateSuggestedStreamSpecMap(
-        bestSizes: List<Size>,
+        bestSizesAndMaxFps: BestSizesAndMaxFpsForConfigs,
         targetFpsRange: Range<Int>?,
-        bestConfigMaxFps: Int,
         newUseCaseConfigs: List<UseCaseConfig<*>>,
         useCasesPriorityOrder: List<Int>,
         resolvedDynamicRanges: Map<UseCaseConfig<*>, DynamicRange>,
-    ): Map<UseCaseConfig<*>, StreamSpec> {
+    ): MutableMap<UseCaseConfig<*>, StreamSpec> {
         val suggestedStreamSpecMap = mutableMapOf<UseCaseConfig<*>, StreamSpec>()
         var targetFrameRateForDevice: Range<Int>? = null
         if (targetFpsRange != null) {
             targetFrameRateForDevice = getClosestSupportedDeviceFrameRate(
                 targetFpsRange,
-                bestConfigMaxFps
+                bestSizesAndMaxFps.maxFps
             )
         }
         for ((index, useCaseConfig) in newUseCaseConfigs.withIndex()) {
             val resolutionForUseCase =
-                bestSizes[
+                bestSizesAndMaxFps.bestSizes[
                     useCasesPriorityOrder.indexOf(index)]
             val streamSpecBuilder = StreamSpec.builder(resolutionForUseCase)
                 .setDynamicRange(
                     checkNotNull(resolvedDynamicRanges[useCaseConfig])
                 )
+                .setImplementationOptions(
+                    StreamUseCaseUtil.getStreamSpecImplementationOptions(
+                        useCaseConfig
+                    )
+                )
+
             if (targetFrameRateForDevice != null) {
                 streamSpecBuilder.setExpectedFrameRateRange(targetFrameRateForDevice)
             }
@@ -479,10 +711,16 @@
         possibleSizeList: List<Size>,
         newUseCaseConfigs: List<UseCaseConfig<*>>,
         useCasesPriorityOrder: List<Int>,
-    ): List<SurfaceConfig> {
+        surfaceConfigIndexAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo>?,
+        surfaceConfigIndexUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>>?
+    ): MutableList<SurfaceConfig> {
         val surfaceConfigList: MutableList<SurfaceConfig> = mutableListOf()
         for (attachedSurfaceInfo in attachedSurfaces) {
             surfaceConfigList.add(attachedSurfaceInfo.surfaceConfig)
+            if (surfaceConfigIndexAttachedSurfaceInfoMap != null) {
+                surfaceConfigIndexAttachedSurfaceInfoMap[surfaceConfigList.size - 1] =
+                    attachedSurfaceInfo
+            }
         }
 
         // Attach SurfaceConfig of new use cases
@@ -497,6 +735,9 @@
                 getUpdatedSurfaceSizeDefinitionByFormat(imageFormat)
             )
             surfaceConfigList.add(surfaceConfig)
+            if (surfaceConfigIndexUseCaseConfigMap != null) {
+                surfaceConfigIndexUseCaseConfigMap[surfaceConfigList.size - 1] = newUseCase
+            }
         }
         return surfaceConfigList
     }
@@ -842,11 +1083,13 @@
         // Preview Stabilization
         val availablePreviewStabilizationModes: IntArray? =
             cameraMetadata.get<IntArray>(
-                CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES)
+                CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES
+            )
 
         availablePreviewStabilizationModes?.apply {
             isPreviewStabilizationSupported = contains(
-                CameraCharacteristics.CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION)
+                CameraCharacteristics.CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION
+            )
         }
     }
 
@@ -889,6 +1132,14 @@
         )
     }
 
+    private fun generateStreamUseCaseSupportedCombinationList() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+            surfaceCombinationsStreamUseCase.addAll(
+                GuaranteedConfigurationsUtil.getStreamUseCaseSupportedCombinationList()
+            )
+        }
+    }
+
     /**
      * Generation the size definition for VGA, s720p, PREVIEW, s1440p, RECORD, MAXIMUM and
      * ULTRA_MAXIMUM.
@@ -1224,4 +1475,11 @@
         val requiredMaxBitDepth: Int,
         val isPreviewStabilizationOn: Boolean = false
     )
+
+    data class BestSizesAndMaxFpsForConfigs(
+        val bestSizes: List<Size>,
+        val bestSizesForStreamUseCase: List<Size>?,
+        val maxFps: Int,
+        val maxFpsForStreamUseCase: Int
+    )
 }
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/MeteringRepeating.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/MeteringRepeating.kt
index 116a504..df93eea 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/MeteringRepeating.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/MeteringRepeating.kt
@@ -43,8 +43,10 @@
 import androidx.camera.core.impl.SessionConfig
 import androidx.camera.core.impl.StreamSpec
 import androidx.camera.core.impl.UseCaseConfig
+import androidx.camera.core.impl.UseCaseConfig.OPTION_CAPTURE_TYPE
 import androidx.camera.core.impl.UseCaseConfig.OPTION_SESSION_CONFIG_UNPACKER
 import androidx.camera.core.impl.UseCaseConfigFactory
+import androidx.camera.core.impl.UseCaseConfigFactory.CaptureType
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import kotlin.math.min
 
@@ -191,6 +193,7 @@
                 OPTION_SESSION_CONFIG_UNPACKER,
                 CameraUseCaseAdapter.DefaultSessionOptionsUnpacker
             )
+            insertOption(OPTION_CAPTURE_TYPE, CaptureType.METERING_REPEATING)
         }
 
         override fun getCaptureType() = UseCaseConfigFactory.CaptureType.METERING_REPEATING
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/internal/StreamUseCaseUtil.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/internal/StreamUseCaseUtil.kt
new file mode 100644
index 0000000..fb81b10
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/internal/StreamUseCaseUtil.kt
@@ -0,0 +1,629 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.pipe.integration.internal
+
+import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CameraDevice
+import android.hardware.camera2.CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT
+import android.hardware.camera2.CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW
+import android.hardware.camera2.CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL
+import android.hardware.camera2.CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE
+import android.hardware.camera2.CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.annotation.VisibleForTesting
+import androidx.camera.camera2.pipe.CameraMetadata
+import androidx.camera.camera2.pipe.core.Log
+import androidx.camera.camera2.pipe.integration.adapter.SupportedSurfaceCombination
+import androidx.camera.camera2.pipe.integration.impl.Camera2ImplConfig
+import androidx.camera.camera2.pipe.integration.impl.STREAM_USE_CASE_OPTION
+import androidx.camera.core.DynamicRange
+import androidx.camera.core.ExperimentalZeroShutterLag
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.ImageCapture.CaptureMode
+import androidx.camera.core.impl.AttachedSurfaceInfo
+import androidx.camera.core.impl.CameraMode
+import androidx.camera.core.impl.Config
+import androidx.camera.core.impl.DeferrableSurface
+import androidx.camera.core.impl.ImageCaptureConfig
+import androidx.camera.core.impl.MutableOptionsBundle
+import androidx.camera.core.impl.SessionConfig
+import androidx.camera.core.impl.StreamSpec
+import androidx.camera.core.impl.SurfaceConfig
+import androidx.camera.core.impl.UseCaseConfig
+import androidx.camera.core.impl.UseCaseConfigFactory.CaptureType
+import androidx.camera.core.streamsharing.StreamSharingConfig
+
+@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
+object StreamUseCaseUtil {
+
+    @VisibleForTesting
+    val STREAM_USE_CASE_STREAM_SPEC_OPTION: Config.Option<Long> = Config.Option.create(
+        "camera2.streamSpec.streamUseCase",
+        Long::class.javaPrimitiveType!!
+    )
+    private val STREAM_USE_CASE_TO_ELIGIBLE_CAPTURE_TYPES_MAP:
+        Map<Long, Set<CaptureType>> = buildMap {
+        if (Build.VERSION.SDK_INT >= 33) {
+            put(
+                SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL.toLong(),
+                setOf(CaptureType.PREVIEW)
+            )
+            put(
+                SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong(),
+                setOf(CaptureType.PREVIEW, CaptureType.IMAGE_ANALYSIS)
+            )
+            put(
+                SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong(),
+                setOf(CaptureType.IMAGE_CAPTURE)
+            )
+            put(
+                SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong(),
+                setOf(CaptureType.VIDEO_CAPTURE)
+            )
+        }
+    }
+
+    private val STREAM_USE_CASE_TO_ELIGIBLE_STREAM_SHARING_CHILDREN_TYPES_MAP:
+        Map<Long, Set<CaptureType>> = buildMap {
+        if (Build.VERSION.SDK_INT >= 33) {
+            put(
+                SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL.toLong(),
+                setOf(CaptureType.PREVIEW, CaptureType.IMAGE_CAPTURE, CaptureType.VIDEO_CAPTURE)
+            )
+            put(
+                SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong(),
+                setOf(CaptureType.PREVIEW, CaptureType.VIDEO_CAPTURE)
+            )
+        }
+    }
+
+    /**
+     * Populates the mapping between surfaces of a capture session and the Stream Use Case of their
+     * associated stream.
+     *
+     * @param sessionConfigs   collection of all session configs for this capture session
+     * @param streamUseCaseMap the mapping between surfaces and Stream Use Case flag
+     */
+    fun populateSurfaceToStreamUseCaseMapping(
+        sessionConfigs: Collection<SessionConfig>,
+        useCaseConfigs: Collection<UseCaseConfig<*>>,
+        streamUseCaseMap: MutableMap<DeferrableSurface, Long>
+    ) {
+        var position = 0
+        var hasStreamUseCase = false
+        val useCaseConfigArrayList = ArrayList(useCaseConfigs)
+        for (sessionConfig: SessionConfig in sessionConfigs) {
+            if (sessionConfig.implementationOptions.containsOption(
+                    STREAM_USE_CASE_STREAM_SPEC_OPTION
+                ) && sessionConfig.surfaces.size != 1
+            ) {
+                Log.error {
+                    "StreamUseCaseUtil: SessionConfig has stream use case but also contains " +
+                        "${sessionConfig.surfaces.size} surfaces, " +
+                        "abort populateSurfaceToStreamUseCaseMapping()."
+                }
+                return
+            }
+            if (sessionConfig.implementationOptions.containsOption(
+                    STREAM_USE_CASE_STREAM_SPEC_OPTION
+                )
+            ) {
+                hasStreamUseCase = true
+                break
+            }
+        }
+        if (hasStreamUseCase) {
+            for (sessionConfig: SessionConfig in sessionConfigs) {
+                if ((useCaseConfigArrayList[position].captureType
+                        == CaptureType.METERING_REPEATING)
+                ) {
+                    // MeteringRepeating is attached after the StreamUseCase population logic and
+                    // therefore won't have the StreamUseCase option. It should always have
+                    // SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW
+                    streamUseCaseMap[sessionConfig.surfaces[0]] =
+                        SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+                } else if (sessionConfig.implementationOptions.containsOption(
+                        STREAM_USE_CASE_STREAM_SPEC_OPTION
+                    )
+                ) {
+                    streamUseCaseMap[sessionConfig.surfaces[0]] =
+                        sessionConfig.implementationOptions.retrieveOption(
+                            STREAM_USE_CASE_STREAM_SPEC_OPTION
+                        )!!
+                }
+                position++
+            }
+        }
+    }
+
+    /**
+     * Populate all implementation options needed to determine the StreamUseCase option in the
+     * StreamSpec for this UseCaseConfig
+     */
+    fun getStreamSpecImplementationOptions(
+        useCaseConfig: UseCaseConfig<*>
+    ): Camera2ImplConfig {
+        val optionsBundle = MutableOptionsBundle.create()
+        if (useCaseConfig.containsOption(STREAM_USE_CASE_OPTION)) {
+            optionsBundle.insertOption(
+                STREAM_USE_CASE_OPTION,
+                useCaseConfig.retrieveOption(STREAM_USE_CASE_OPTION)
+            )
+        }
+        if (useCaseConfig.containsOption(UseCaseConfig.OPTION_ZSL_DISABLED)) {
+            optionsBundle.insertOption(
+                UseCaseConfig.OPTION_ZSL_DISABLED,
+                useCaseConfig.retrieveOption(UseCaseConfig.OPTION_ZSL_DISABLED)
+            )
+        }
+        if (useCaseConfig.containsOption(ImageCaptureConfig.OPTION_IMAGE_CAPTURE_MODE)) {
+            optionsBundle.insertOption(
+                ImageCaptureConfig.OPTION_IMAGE_CAPTURE_MODE,
+                useCaseConfig
+                    .retrieveOption(ImageCaptureConfig.OPTION_IMAGE_CAPTURE_MODE)
+            )
+        }
+        if (useCaseConfig.containsOption(UseCaseConfig.OPTION_INPUT_FORMAT)) {
+            optionsBundle.insertOption(
+                UseCaseConfig.OPTION_INPUT_FORMAT,
+                useCaseConfig
+                    .retrieveOption(UseCaseConfig.OPTION_INPUT_FORMAT)
+            )
+        }
+        return Camera2ImplConfig(optionsBundle)
+    }
+
+    /**
+     * Return true if the given camera characteristics support stream use case
+     */
+    fun isStreamUseCaseSupported(
+        cameraMetadata: CameraMetadata
+    ): Boolean {
+        if (Build.VERSION.SDK_INT < 33) {
+            return false
+        }
+        val availableStreamUseCases: LongArray? =
+            cameraMetadata[CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES]
+        return !(availableStreamUseCases == null || availableStreamUseCases.isEmpty())
+    }
+
+    /**
+     * Return true if the given feature settings is appropriate for stream use case usage.
+     */
+    fun shouldUseStreamUseCase(
+        featureSettings: SupportedSurfaceCombination.FeatureSettings
+    ): Boolean {
+        return (featureSettings.cameraMode == CameraMode.DEFAULT &&
+            featureSettings.requiredMaxBitDepth == DynamicRange.BIT_DEPTH_8_BIT)
+    }
+
+    /**
+     * Populate the [STREAM_USE_CASE_STREAM_SPEC_OPTION] option in StreamSpecs for both
+     * existing UseCases and new UseCases to be attached. This option will be written into the
+     * session configurations of the UseCases. When creating a new capture session during
+     * downstream, it will be used to set the StreamUseCase flag via
+     * [android.hardware.camera2.params.OutputConfiguration.setStreamUseCase]
+     *
+     * @param cameraMetadata               the camera characteristics of the device
+     * @param attachedSurfaces             surface info of the already attached use cases
+     * @param suggestedStreamSpecMap       the UseCaseConfig-to-StreamSpec map for new use cases
+     * @param attachedSurfaceStreamSpecMap the SurfaceInfo-to-StreamSpec map for attached use cases
+     * whose StreamSpecs needs to be updated
+     * @return true if StreamSpec options are populated. False if not.
+     */
+    fun populateStreamUseCaseStreamSpecOptionWithInteropOverride(
+        cameraMetadata: CameraMetadata,
+        attachedSurfaces: List<AttachedSurfaceInfo>,
+        suggestedStreamSpecMap: MutableMap<UseCaseConfig<*>, StreamSpec>,
+        attachedSurfaceStreamSpecMap: MutableMap<AttachedSurfaceInfo, StreamSpec>
+    ): Boolean {
+        if (Build.VERSION.SDK_INT < 33) {
+            return false
+        }
+        val newUseCaseConfigs: List<UseCaseConfig<*>> =
+            java.util.ArrayList(suggestedStreamSpecMap.keys)
+        // All AttachedSurfaceInfo should have implementation options
+        for (attachedSurfaceInfo in attachedSurfaces) {
+            checkNotNull(attachedSurfaceInfo.implementationOptions)
+        }
+        // All StreamSpecs in the map should have implementation options
+        for (useCaseConfig in newUseCaseConfigs) {
+            checkNotNull(
+                checkNotNull(
+                    suggestedStreamSpecMap[useCaseConfig]
+                ).implementationOptions
+            )
+        }
+        val availableStreamUseCases: LongArray? =
+            cameraMetadata[CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES]
+        if (availableStreamUseCases == null || availableStreamUseCases.isEmpty()) {
+            return false
+        }
+        val availableStreamUseCaseSet: MutableSet<Long> = HashSet()
+        for (availableStreamUseCase in availableStreamUseCases) {
+            availableStreamUseCaseSet.add(availableStreamUseCase)
+        }
+        if (isValidCamera2InteropOverride(
+                attachedSurfaces, newUseCaseConfigs,
+                availableStreamUseCaseSet
+            )
+        ) {
+            for (attachedSurfaceInfo in attachedSurfaces) {
+                val oldImplementationOptions = attachedSurfaceInfo.implementationOptions
+                getUpdatedImplementationOptionsWithUseCaseStreamSpecOption(
+                    oldImplementationOptions!!,
+                    oldImplementationOptions.retrieveOption(STREAM_USE_CASE_OPTION)
+                )?.also {
+                    attachedSurfaceStreamSpecMap[attachedSurfaceInfo] =
+                        attachedSurfaceInfo.toStreamSpec(it)
+                }
+            }
+            for (newUseCaseConfig in newUseCaseConfigs) {
+                val oldStreamSpec = suggestedStreamSpecMap[newUseCaseConfig]
+                val oldImplementationOptions = oldStreamSpec!!.implementationOptions
+                getUpdatedImplementationOptionsWithUseCaseStreamSpecOption(
+                    oldImplementationOptions!!,
+                    oldImplementationOptions.retrieveOption(STREAM_USE_CASE_OPTION)
+                )?.also {
+                    suggestedStreamSpecMap[newUseCaseConfig] =
+                        oldStreamSpec.toBuilder().setImplementationOptions(it).build()
+                }
+            }
+            return true
+        }
+        return false
+    }
+
+    /**
+     * Return true if  the stream use cases in the given surface configurations are available for
+     * the device.
+     */
+    fun areStreamUseCasesAvailableForSurfaceConfigs(
+        cameraMetadata: CameraMetadata,
+        surfaceConfigs: List<SurfaceConfig>
+    ): Boolean {
+        if (Build.VERSION.SDK_INT < 33) {
+            return false
+        }
+        val availableStreamUseCases: LongArray? =
+            cameraMetadata[CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES]
+        if (availableStreamUseCases == null || availableStreamUseCases.isEmpty()) {
+            return false
+        }
+        val availableStreamUseCaseSet: MutableSet<Long> = java.util.HashSet()
+        for (availableStreamUseCase in availableStreamUseCases) {
+            availableStreamUseCaseSet.add(availableStreamUseCase)
+        }
+        for (surfaceConfig in surfaceConfigs) {
+            if (!availableStreamUseCaseSet.contains(surfaceConfig.streamUseCase)) {
+                return false
+            }
+        }
+        return true
+    }
+
+    /**
+     * Return true if the given capture type and stream use case are a eligible pair. If the
+     * given captureType is STREAM_SHARING, checks the streamSharingTypes, which are the capture
+     * types of the children, are eligible with the stream use case.
+     */
+    private fun isEligibleCaptureType(
+        captureType: CaptureType,
+        streamUseCase: Long,
+        streamSharingTypes: List<CaptureType>
+    ): Boolean {
+        if (Build.VERSION.SDK_INT < 33) {
+            return false
+        }
+        return if (captureType == CaptureType.STREAM_SHARING) {
+            if (!STREAM_USE_CASE_TO_ELIGIBLE_STREAM_SHARING_CHILDREN_TYPES_MAP.containsKey(
+                    streamUseCase
+                )
+            ) {
+                return false
+            }
+            val captureTypes: Set<CaptureType> =
+                STREAM_USE_CASE_TO_ELIGIBLE_STREAM_SHARING_CHILDREN_TYPES_MAP[streamUseCase]!!
+            if (streamSharingTypes.size != captureTypes.size) {
+                return false
+            }
+            for (childType in streamSharingTypes) {
+                if (!captureTypes.contains(childType)) {
+                    return false
+                }
+            }
+            true
+        } else {
+            STREAM_USE_CASE_TO_ELIGIBLE_CAPTURE_TYPES_MAP.containsKey(streamUseCase) &&
+                STREAM_USE_CASE_TO_ELIGIBLE_CAPTURE_TYPES_MAP[streamUseCase]!!.contains(
+                    captureType
+                )
+        }
+    }
+
+    /**
+     * Return true if the stream use cases contained in surfaceConfigsWithStreamUseCases all have
+     * eligible capture type pairing with the use cases that these surfaceConfigs are constructed
+     * from.
+     *
+     * @param surfaceConfigIndexAttachedSurfaceInfoMap mapping between an surfaceConfig's index
+     *                                                 in the list and the attachedSurfaceInfo it
+     *                                                 is constructed from
+     * @param surfaceConfigIndexUseCaseConfigMap       mapping between an surfaceConfig's index
+     *                                                 in the list and the useCaseConfig it is
+     *                                                 constructed from
+     * @param surfaceConfigsWithStreamUseCase          the supported surfaceConfigs that contains
+     *                                                 accurate streamUseCases
+     */
+    fun areCaptureTypesEligible(
+        surfaceConfigIndexAttachedSurfaceInfoMap: Map<Int, AttachedSurfaceInfo?>,
+        surfaceConfigIndexUseCaseConfigMap: Map<Int, UseCaseConfig<*>>,
+        surfaceConfigsWithStreamUseCase: List<SurfaceConfig>
+    ): Boolean {
+        for (i in surfaceConfigsWithStreamUseCase.indices) {
+            // Verify that the use case has the eligible capture type the given stream use case.
+            val streamUseCase = surfaceConfigsWithStreamUseCase[i].streamUseCase
+            if (surfaceConfigIndexAttachedSurfaceInfoMap.containsKey(i)) {
+                val attachedSurfaceInfo = surfaceConfigIndexAttachedSurfaceInfoMap[i]
+                if (!isEligibleCaptureType(
+                        if (attachedSurfaceInfo!!.captureTypes.size == 1)
+                            attachedSurfaceInfo.captureTypes[0] else CaptureType.STREAM_SHARING,
+                        streamUseCase,
+                        attachedSurfaceInfo.captureTypes
+                    )
+                ) {
+                    return false
+                }
+            } else if (surfaceConfigIndexUseCaseConfigMap.containsKey(i)) {
+                val newUseCaseConfig = surfaceConfigIndexUseCaseConfigMap[i]!!
+                if (!isEligibleCaptureType(
+                        newUseCaseConfig.captureType, streamUseCase,
+                        if (newUseCaseConfig.captureType
+                            == CaptureType.STREAM_SHARING
+                        ) (newUseCaseConfig as StreamSharingConfig).captureTypes else emptyList()
+                    )
+                ) {
+                    return false
+                }
+            } else {
+                throw AssertionError("SurfaceConfig does not map to any use case")
+            }
+        }
+        return true
+    }
+
+    /**
+     * @param suggestedStreamSpecMap                   mapping between useCaseConfig and its
+     *                                                 streamSpecs
+     * @param attachedSurfaceStreamSpecMap             mapping between attachedSurfaceInfo and its
+     *                                                 streamSpecs that contains streamUseCases.
+     *                                                 All streamSpecs in this map has
+     *                                                 streamUseCases
+     * @param surfaceConfigIndexAttachedSurfaceInfoMap mapping between an surfaceConfig's index
+     *                                                 in the list and the
+     *                                                 attachedSurfaceInfo it
+     *                                                 is constructed from
+     * @param surfaceConfigIndexUseCaseConfigMap       mapping between an surfaceConfig's
+     *                                                 index in the list and the useCaseConfig
+     *                                                 it is constructed from
+     * @param surfaceConfigsWithStreamUseCase          the supported surfaceConfigs that contains
+     *                                                 accurate streamUseCases
+     */
+    fun populateStreamUseCaseStreamSpecOptionWithSupportedSurfaceConfigs(
+        suggestedStreamSpecMap: MutableMap<UseCaseConfig<*>, StreamSpec>,
+        attachedSurfaceStreamSpecMap: MutableMap<AttachedSurfaceInfo, StreamSpec>,
+        surfaceConfigIndexAttachedSurfaceInfoMap: Map<Int, AttachedSurfaceInfo>,
+        surfaceConfigIndexUseCaseConfigMap: Map<Int, UseCaseConfig<*>>,
+        surfaceConfigsWithStreamUseCase: List<SurfaceConfig>
+    ) {
+        // Populate StreamSpecs with stream use cases.
+        for (i in surfaceConfigsWithStreamUseCase.indices) {
+            val streamUseCase = surfaceConfigsWithStreamUseCase[i].streamUseCase
+            if (surfaceConfigIndexAttachedSurfaceInfoMap.containsKey(i)) {
+                val attachedSurfaceInfo = surfaceConfigIndexAttachedSurfaceInfoMap[i]
+                val oldImplementationOptions = attachedSurfaceInfo!!.implementationOptions
+                val newImplementationOptions: Config? =
+                    getUpdatedImplementationOptionsWithUseCaseStreamSpecOption(
+                        oldImplementationOptions!!, streamUseCase
+                    )
+                if (newImplementationOptions != null) {
+                    attachedSurfaceStreamSpecMap[attachedSurfaceInfo] =
+                        attachedSurfaceInfo.toStreamSpec(newImplementationOptions)
+                }
+            } else if (surfaceConfigIndexUseCaseConfigMap.containsKey(i)) {
+                val newUseCaseConfig: UseCaseConfig<*> = surfaceConfigIndexUseCaseConfigMap[i]!!
+                val oldStreamSpec = suggestedStreamSpecMap[newUseCaseConfig]
+                val oldImplementationOptions = oldStreamSpec!!.implementationOptions
+                val newImplementationOptions: Config? =
+                    getUpdatedImplementationOptionsWithUseCaseStreamSpecOption(
+                        oldImplementationOptions!!, streamUseCase
+                    )
+                if (newImplementationOptions != null) {
+                    val newStreamSpec = oldStreamSpec.toBuilder().setImplementationOptions(
+                        newImplementationOptions
+                    ).build()
+                    suggestedStreamSpecMap[newUseCaseConfig] = newStreamSpec
+                }
+            } else {
+                throw AssertionError("SurfaceConfig does not map to any use case")
+            }
+        }
+    }
+
+    /**
+     * Given an old options, return a new option with stream use case stream spec option inserted
+     */
+    private fun getUpdatedImplementationOptionsWithUseCaseStreamSpecOption(
+        oldImplementationOptions: Config,
+        streamUseCase: Long?
+    ): Config? {
+        if (oldImplementationOptions.containsOption(STREAM_USE_CASE_STREAM_SPEC_OPTION) &&
+            oldImplementationOptions.retrieveOption(STREAM_USE_CASE_STREAM_SPEC_OPTION) ==
+            streamUseCase
+        ) {
+            // The old options already has the same stream use case. No need to update
+            return null
+        }
+        val optionsBundle = MutableOptionsBundle.from(oldImplementationOptions)
+        optionsBundle.insertOption(STREAM_USE_CASE_STREAM_SPEC_OPTION, streamUseCase)
+        return Camera2ImplConfig(optionsBundle)
+    }
+
+    /**
+     * Return true if any one of the existing or new UseCases is ZSL.
+     */
+    fun containsZslUseCase(
+        attachedSurfaces: List<AttachedSurfaceInfo>,
+        newUseCaseConfigs: List<UseCaseConfig<*>>
+    ): Boolean {
+        for (attachedSurfaceInfo: AttachedSurfaceInfo in attachedSurfaces) {
+            val captureTypes = attachedSurfaceInfo.captureTypes
+            val captureType = captureTypes[0]
+            if (isZslUseCase(
+                    attachedSurfaceInfo.implementationOptions!!,
+                    captureType
+                )
+            ) {
+                return true
+            }
+        }
+        for (useCaseConfig: UseCaseConfig<*> in newUseCaseConfigs) {
+            if (isZslUseCase(useCaseConfig, useCaseConfig.captureType)) {
+                return true
+            }
+        }
+        return false
+    }
+
+    /**
+     * Check whether a UseCase is ZSL.
+     */
+    private fun isZslUseCase(
+        config: Config,
+        captureType: CaptureType
+    ): Boolean {
+        if (config.retrieveOption(UseCaseConfig.OPTION_ZSL_DISABLED, false)!!) {
+            return false
+        }
+        // Skip if capture mode doesn't exist in the options
+        if (!config.containsOption(ImageCaptureConfig.OPTION_IMAGE_CAPTURE_MODE)) {
+            return false
+        }
+        @CaptureMode val captureMode: Int =
+            config.retrieveOption(ImageCaptureConfig.OPTION_IMAGE_CAPTURE_MODE)!!
+        return (getSessionConfigTemplateType(captureType, captureMode)
+            == CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG)
+    }
+
+    /**
+     * Check whether the given StreamUseCases are available to the device.
+     */
+    private fun areStreamUseCasesAvailable(
+        availableStreamUseCasesSet: Set<Long>,
+        streamUseCases: Set<Long>
+    ): Boolean {
+        for (streamUseCase: Long in streamUseCases) {
+            if (!availableStreamUseCasesSet.contains(streamUseCase)) {
+                return false
+            }
+        }
+        return true
+    }
+
+    private fun throwInvalidCamera2InteropOverrideException() {
+        throw IllegalArgumentException(
+            "Either all use cases must have non-default stream use " +
+                "case assigned or none should have it"
+        )
+    }
+
+    /**
+     * Return true if all existing UseCases and new UseCases have Camera2Interop override and
+     * these StreamUseCases are all available to the device.
+     */
+    private fun isValidCamera2InteropOverride(
+        attachedSurfaces: List<AttachedSurfaceInfo>,
+        newUseCaseConfigs: List<UseCaseConfig<*>>,
+        availableStreamUseCases: Set<Long>
+    ): Boolean {
+        val streamUseCases: MutableSet<Long> = mutableSetOf()
+        var hasNonDefaultStreamUseCase = false
+        var hasDefaultOrNullStreamUseCase = false
+        for (attachedSurfaceInfo: AttachedSurfaceInfo in attachedSurfaces) {
+            if (!attachedSurfaceInfo.implementationOptions!!.containsOption(
+                    STREAM_USE_CASE_OPTION
+                )
+            ) {
+                hasDefaultOrNullStreamUseCase = true
+                break
+            }
+            val streamUseCaseOverride: Long = (attachedSurfaceInfo.implementationOptions!!
+                .retrieveOption(STREAM_USE_CASE_OPTION))!!
+            if ((streamUseCaseOverride == SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT.toLong())) {
+                hasDefaultOrNullStreamUseCase = true
+                break
+            }
+            hasNonDefaultStreamUseCase = true
+            break
+        }
+        for (useCaseConfig: UseCaseConfig<*> in newUseCaseConfigs) {
+            if (!useCaseConfig.containsOption(STREAM_USE_CASE_OPTION)) {
+                hasDefaultOrNullStreamUseCase = true
+                if (hasNonDefaultStreamUseCase) {
+                    throwInvalidCamera2InteropOverrideException()
+                }
+            } else {
+                val streamUseCaseOverride: Long =
+                    useCaseConfig.retrieveOption(STREAM_USE_CASE_OPTION)!!
+                if ((streamUseCaseOverride == SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT.toLong())
+                ) {
+                    hasDefaultOrNullStreamUseCase = true
+                    if (hasNonDefaultStreamUseCase) {
+                        throwInvalidCamera2InteropOverrideException()
+                    }
+                } else {
+                    hasNonDefaultStreamUseCase = true
+                    if (hasDefaultOrNullStreamUseCase) {
+                        throwInvalidCamera2InteropOverrideException()
+                    }
+                    streamUseCases.add(streamUseCaseOverride)
+                }
+            }
+        }
+        return !hasDefaultOrNullStreamUseCase && areStreamUseCasesAvailable(
+            availableStreamUseCases,
+            streamUseCases
+        )
+    }
+
+    @androidx.annotation.OptIn(markerClass = [ExperimentalZeroShutterLag::class])
+    private fun getSessionConfigTemplateType(
+        captureType: CaptureType,
+        @CaptureMode captureMode: Int
+    ): Int {
+        return when (captureType) {
+            CaptureType.IMAGE_CAPTURE ->
+                if (captureMode == ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG)
+                    CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG else CameraDevice.TEMPLATE_PREVIEW
+
+            CaptureType.VIDEO_CAPTURE, CaptureType.STREAM_SHARING -> CameraDevice.TEMPLATE_RECORD
+            CaptureType.PREVIEW, CaptureType.IMAGE_ANALYSIS -> CameraDevice.TEMPLATE_PREVIEW
+            else -> CameraDevice.TEMPLATE_PREVIEW
+        }
+    }
+}
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapterTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapterTest.kt
index 1b550d6..7e3c3a6 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapterTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapterTest.kt
@@ -20,18 +20,12 @@
 
 import android.graphics.SurfaceTexture
 import android.hardware.camera2.CameraDevice
-import android.media.MediaCodec
 import android.os.Build
 import android.view.Surface
 import androidx.annotation.RequiresApi
-import androidx.camera.camera2.pipe.integration.impl.STREAM_USE_CASE_OPTION
-import androidx.camera.core.ImageAnalysis
-import androidx.camera.core.ImageCapture
-import androidx.camera.core.Preview
 import androidx.camera.core.impl.DeferrableSurface
 import androidx.camera.core.impl.SessionConfig
 import androidx.camera.core.impl.utils.futures.Futures
-import androidx.camera.core.streamsharing.StreamSharing
 import androidx.camera.testing.impl.fakes.FakeUseCase
 import androidx.camera.testing.impl.fakes.FakeUseCaseConfig
 import androidx.testutils.MainDispatcherRule
@@ -43,7 +37,6 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mockito
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
 
@@ -52,10 +45,6 @@
 @DoNotInstrument
 class SessionConfigAdapterTest {
 
-    private val mockSurface = Mockito.mock(DeferrableSurface::class.java)
-    private val mockSessionConfig = Mockito.mock(SessionConfig::class.java)
-    private val mockImplementationOption =
-        Mockito.mock(androidx.camera.core.impl.Config::class.java)
     private val sessionConfigAdapter = SessionConfigAdapter(listOf())
 
     @get:Rule
@@ -134,7 +123,7 @@
 
     @Test
     fun populateSurfaceToStreamUseCaseMappingEmptyUseCase() {
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(listOf(), true)
+        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(listOf(), listOf())
         TestCase.assertTrue(mapping.isEmpty())
     }
 
@@ -144,109 +133,6 @@
         TestCase.assertTrue(mapping.isEmpty())
     }
 
-    @Test
-    fun populateSurfaceToStreamUseCaseMappingNoAppropriateContainerClass() {
-        Mockito.`when`(mockSurface.containerClass).thenReturn(FakeUseCase::class.java)
-        Mockito.`when`(mockSessionConfig.surfaces).thenReturn(listOf(mockSurface))
-        Mockito.`when`(mockSessionConfig.implementationOptions).thenReturn(mockImplementationOption)
-        val sessionConfigs: MutableCollection<SessionConfig> = ArrayList()
-        sessionConfigs.add(mockSessionConfig)
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(sessionConfigs, true)
-        TestCase.assertTrue(mapping[mockSurface] == 0L)
-    }
-
-    @Test
-    fun populateSurfaceToStreamUseCaseMappingPreview() {
-        Mockito.`when`(mockSurface.containerClass).thenReturn(Preview::class.java)
-        Mockito.`when`(mockSessionConfig.surfaces).thenReturn(listOf(mockSurface))
-        Mockito.`when`(mockSessionConfig.implementationOptions).thenReturn(mockImplementationOption)
-        val sessionConfigs: MutableCollection<SessionConfig> = ArrayList()
-        sessionConfigs.add(mockSessionConfig)
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(sessionConfigs, true)
-        TestCase.assertTrue(mapping.isNotEmpty())
-        TestCase.assertTrue(mapping[mockSurface] == 1L)
-    }
-
-    @Test
-    fun populateSurfaceToStreamUseCaseMappingZSL() {
-        Mockito.`when`(mockSurface.containerClass).thenReturn(Preview::class.java)
-        Mockito.`when`(mockSessionConfig.surfaces).thenReturn(listOf(mockSurface))
-        Mockito.`when`(mockSessionConfig.implementationOptions)
-            .thenReturn(mockImplementationOption)
-        Mockito.`when`(mockSessionConfig.templateType)
-            .thenReturn(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG)
-        val sessionConfigs: MutableCollection<SessionConfig> = ArrayList()
-        sessionConfigs.add(mockSessionConfig)
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(sessionConfigs, true)
-        TestCase.assertTrue(mapping.isEmpty())
-    }
-
-    @Test
-    fun populateSurfaceToStreamUseCaseMappingImageAnalysis() {
-        Mockito.`when`(mockSurface.containerClass).thenReturn(ImageAnalysis::class.java)
-        Mockito.`when`(mockSessionConfig.surfaces).thenReturn(listOf(mockSurface))
-        Mockito.`when`(mockSessionConfig.implementationOptions)
-            .thenReturn(mockImplementationOption)
-        val sessionConfigs: MutableCollection<SessionConfig> = ArrayList()
-        sessionConfigs.add(mockSessionConfig)
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(sessionConfigs, true)
-        TestCase.assertTrue(mapping.isNotEmpty())
-        TestCase.assertTrue(mapping[mockSurface] == 1L)
-    }
-
-    @Test
-    fun populateSurfaceToStreamUseCaseMappingImageCapture() {
-        Mockito.`when`(mockSurface.containerClass).thenReturn(ImageCapture::class.java)
-        Mockito.`when`(mockSessionConfig.surfaces).thenReturn(listOf(mockSurface))
-        Mockito.`when`(mockSessionConfig.implementationOptions).thenReturn(mockImplementationOption)
-        val sessionConfigs: MutableCollection<SessionConfig> = ArrayList()
-        sessionConfigs.add(mockSessionConfig)
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(sessionConfigs, true)
-        TestCase.assertTrue(mapping.isNotEmpty())
-        TestCase.assertTrue(mapping[mockSurface] == 2L)
-    }
-
-    @Test
-    fun populateSurfaceToStreamUseCaseMappingVideoCapture() {
-        Mockito.`when`(mockSurface.containerClass).thenReturn(MediaCodec::class.java)
-        Mockito.`when`(mockSessionConfig.surfaces).thenReturn(listOf(mockSurface))
-        Mockito.`when`(mockSessionConfig.implementationOptions).thenReturn(mockImplementationOption)
-        val sessionConfigs: MutableCollection<SessionConfig> = ArrayList()
-        sessionConfigs.add(mockSessionConfig)
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(sessionConfigs, true)
-        TestCase.assertTrue(mapping.isNotEmpty())
-        TestCase.assertTrue(mapping[mockSurface] == 3L)
-    }
-
-    @Test
-    fun populateSurfaceToStreamUseCaseMappingStreamSharing() {
-        Mockito.`when`(mockSurface.containerClass).thenReturn(StreamSharing::class.java)
-        Mockito.`when`(mockSessionConfig.surfaces).thenReturn(listOf(mockSurface))
-        Mockito.`when`(mockSessionConfig.implementationOptions).thenReturn(mockImplementationOption)
-        val sessionConfigs: MutableCollection<SessionConfig> = ArrayList()
-        sessionConfigs.add(mockSessionConfig)
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(sessionConfigs, true)
-        TestCase.assertTrue(mapping.isNotEmpty())
-        TestCase.assertTrue(mapping[mockSurface] == 3L)
-    }
-
-    @Test
-    fun populateSurfaceToStreamUseCaseMappingCustomized() {
-        Mockito.`when`(mockSurface.containerClass).thenReturn(MediaCodec::class.java)
-        Mockito.`when`(mockSessionConfig.surfaces).thenReturn(listOf(mockSurface))
-        Mockito.`when`(mockSessionConfig.implementationOptions)
-            .thenReturn(mockImplementationOption)
-        Mockito.`when`(mockImplementationOption.containsOption(STREAM_USE_CASE_OPTION))
-            .thenReturn(true)
-        Mockito.`when`(mockImplementationOption.retrieveOption(STREAM_USE_CASE_OPTION))
-            .thenReturn(0L)
-        val sessionConfigs: MutableCollection<SessionConfig> = ArrayList()
-        sessionConfigs.add(mockSessionConfig)
-        val mapping = sessionConfigAdapter.getSurfaceToStreamUseCaseMapping(sessionConfigs, true)
-        TestCase.assertTrue(mapping.isNotEmpty())
-        TestCase.assertTrue(mapping[mockSurface] == 0L)
-    }
-
     private fun createFakeTestUseCase(block: (FakeTestUseCase) -> Unit): FakeTestUseCase = run {
         val configBuilder = FakeUseCaseConfig.Builder().setTargetName("UseCase")
         FakeTestUseCase(configBuilder.useCaseConfig).also {
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
index 6b4e41a..0908a7d 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
@@ -32,6 +32,7 @@
 import android.media.CamcorderProfile.QUALITY_720P
 import android.media.MediaRecorder
 import android.os.Build
+import android.util.Pair
 import android.util.Range
 import android.util.Size
 import android.view.WindowManager
@@ -56,6 +57,7 @@
 import androidx.camera.camera2.pipe.integration.internal.HLG10_SDR_CONSTRAINED
 import androidx.camera.camera2.pipe.integration.internal.HLG10_UNCONSTRAINED
 import androidx.camera.camera2.pipe.integration.internal.LATENCY_NONE
+import androidx.camera.camera2.pipe.integration.internal.StreamUseCaseUtil
 import androidx.camera.camera2.pipe.testing.FakeCameraBackend
 import androidx.camera.camera2.pipe.testing.FakeCameraDevices
 import androidx.camera.camera2.pipe.testing.FakeCameraMetadata
@@ -119,6 +121,11 @@
 @DoNotInstrument
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 class SupportedSurfaceCombinationTest {
+    private val streamUseCaseOption: androidx.camera.core.impl.Config.Option<Long> =
+        androidx.camera.core.impl.Config.Option.create(
+            "camera2.cameraCaptureSession.streamUseCase",
+            Long::class.javaPrimitiveType!!
+        )
     private val sensorOrientation90 = 90
     private val landscapePixelArraySize = Size(4032, 3024)
     private val displaySize = Size(720, 1280)
@@ -165,6 +172,8 @@
     private val maximumResolutionHighResolutionSupportedSizes = arrayOf(
         Size(8000, 6000)
     )
+
+    private val streamUseCaseOverrideValue = 3L
     private val context = InstrumentationRegistry.getInstrumentation().context
     private var cameraFactory: FakeCameraFactory? = null
     private var useCaseConfigFactory: UseCaseConfigFactory = mock()
@@ -1532,7 +1541,7 @@
         useCasesExpectedDynamicRangeMap: Map<UseCase, DynamicRange> = emptyMap(),
         dynamicRangeProfiles: DynamicRangeProfiles? = null,
         default10BitProfile: Long? = null,
-    ) {
+    ): Pair<Map<UseCaseConfig<*>, StreamSpec>, Map<AttachedSurfaceInfo, StreamSpec>> {
         setupCamera(
             hardwareLevel = hardwareLevel,
             capabilities = capabilities,
@@ -1547,14 +1556,16 @@
         val useCaseConfigMap = getUseCaseToConfigMap(useCasesExpectedResultMap.keys.toList())
         val useCaseConfigToOutputSizesMap =
             getUseCaseConfigToOutputSizesMap(useCaseConfigMap.values.toList())
-        val suggestedStreamSpecs = supportedSurfaceCombination.getSuggestedStreamSpecifications(
+        val resultPair = supportedSurfaceCombination.getSuggestedStreamSpecifications(
             cameraMode,
             attachedSurfaceInfoList,
             useCaseConfigToOutputSizesMap
-        ).first
+        )
+        val suggestedStreamSpecsForNewUseCases = resultPair.first
+        val suggestedStreamSpecsForOldSurfaces = resultPair.second
 
         useCasesExpectedResultMap.keys.forEach {
-            val resultSize = suggestedStreamSpecs[useCaseConfigMap[it]]!!.resolution
+            val resultSize = suggestedStreamSpecsForNewUseCases[useCaseConfigMap[it]]!!.resolution
             val expectedSize = useCasesExpectedResultMap[it]!!
             if (!compareWithAtMost) {
                 assertThat(resultSize).isEqualTo(expectedSize)
@@ -1564,17 +1575,53 @@
 
             compareExpectedFps?.let { _ ->
                 assertThat(
-                    suggestedStreamSpecs[useCaseConfigMap[it]]!!.expectedFrameRateRange
+                    suggestedStreamSpecsForNewUseCases[
+                        useCaseConfigMap[it]]!!.expectedFrameRateRange
                 ).isEqualTo(compareExpectedFps)
             }
         }
 
         useCasesExpectedDynamicRangeMap.keys.forEach {
-            val resultDynamicRange = suggestedStreamSpecs[useCaseConfigMap[it]]!!.dynamicRange
+            val resultDynamicRange =
+                suggestedStreamSpecsForNewUseCases[useCaseConfigMap[it]]!!.dynamicRange
             val expectedDynamicRange = useCasesExpectedDynamicRangeMap[it]
 
             assertThat(resultDynamicRange).isEqualTo(expectedDynamicRange)
         }
+
+        // Assert that if one stream specification has stream use case options, all other
+        // stream specifications also have it.
+        var hasStreamUseCaseStreamSpecOption: Boolean? = null
+        suggestedStreamSpecsForNewUseCases.entries.forEach {
+            // Gets the first entry to determine whether StreamUseCaseStreamSpecOption
+            // should exist or not.
+            if (hasStreamUseCaseStreamSpecOption == null) {
+                hasStreamUseCaseStreamSpecOption =
+                    it.value.implementationOptions?.containsOption(
+                        StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+                    )
+            }
+
+            // All the other entries should align with the first entry
+            assertThat(
+                it.value.implementationOptions?.containsOption(
+                    StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+                )
+            ).isEqualTo(
+                hasStreamUseCaseStreamSpecOption
+            )
+        }
+        suggestedStreamSpecsForOldSurfaces.entries.forEach {
+            // All entries should align with the first entry
+            assertThat(
+                it.value.implementationOptions?.containsOption(
+                    StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+                )
+            ).isEqualTo(
+                hasStreamUseCaseStreamSpecOption
+            )
+        }
+        return resultPair
     }
 
     private fun getUseCaseToConfigMap(useCases: List<UseCase>): Map<UseCase, UseCaseConfig<*>> {
@@ -2966,6 +3013,104 @@
         assertThat(resultList).containsExactlyElementsIn(expectedResultList).inOrder()
     }
 
+    @Config(minSdk = Build.VERSION_CODES.TIRAMISU)
+    @Test
+    fun canPopulateStreamUseCaseStreamSpecOption_jpeg() {
+        val jpegUseCase =
+            createUseCase(
+                UseCaseConfigFactory.CaptureType.IMAGE_CAPTURE,
+                streamUseCaseOverride = true
+            ) // JPEG
+        val useCaseExpectedResultMap = mutableMapOf<UseCase, Size>().apply {
+            put(jpegUseCase, landscapePixelArraySize)
+        }
+        val resultPair = getSuggestedSpecsAndVerify(useCaseExpectedResultMap)
+        assertThat(resultPair.first.size).isEqualTo(1)
+        assertThat(
+            resultPair.first[jpegUseCase.currentConfig]!!.implementationOptions!!.retrieveOption(
+                StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+            )
+        ).isEqualTo(streamUseCaseOverrideValue)
+    }
+
+    @Config(minSdk = Build.VERSION_CODES.TIRAMISU)
+    @Test
+    fun throwException_PopulateStreamUseCaseStreamSpecOption_notFullyOverride() {
+        val jpegUseCase =
+            createUseCase(
+                UseCaseConfigFactory.CaptureType.IMAGE_CAPTURE,
+                streamUseCaseOverride = true
+            ) // JPEG
+        val yuvUseCase =
+            createUseCase(
+                UseCaseConfigFactory.CaptureType.PREVIEW,
+                streamUseCaseOverride = false
+            ) // PREVIEW
+        val useCaseExpectedResultMap = mutableMapOf<UseCase, Size>().apply {
+            put(jpegUseCase, landscapePixelArraySize)
+            put(yuvUseCase, previewSize)
+        }
+        assertThrows(IllegalArgumentException::class.java) {
+            getSuggestedSpecsAndVerify(useCaseExpectedResultMap)
+        }
+    }
+
+    @Config(minSdk = Build.VERSION_CODES.TIRAMISU)
+    @Test
+    fun skipPopulateStreamUseCaseStreamSpecOption_unsupportedCombination() {
+        val useCase1 =
+            createUseCase(
+                UseCaseConfigFactory.CaptureType.PREVIEW,
+                streamUseCaseOverride = true
+            ) // PREVIEW
+        val useCase2 =
+            createUseCase(
+                UseCaseConfigFactory.CaptureType.PREVIEW,
+                streamUseCaseOverride = true
+            ) // PREVIEW
+        val useCaseExpectedResultMap = mutableMapOf<UseCase, Size>().apply {
+            put(useCase1, previewSize)
+            put(useCase2, previewSize)
+        }
+        // PRIV + PRIV is supported by the Ultra-high table but not Stream use case
+        val resultPair = getSuggestedSpecsAndVerify(
+            useCaseExpectedResultMap, cameraMode = CameraMode.ULTRA_HIGH_RESOLUTION_CAMERA,
+        )
+        assertThat(resultPair.first.size).isEqualTo(2)
+        assertThat(
+            resultPair.first[useCase1.currentConfig]!!.implementationOptions!!.containsOption(
+                StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+            )
+        ).isFalse()
+        assertThat(
+            resultPair.first[useCase2.currentConfig]!!.implementationOptions!!.containsOption(
+                StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+            )
+        ).isFalse()
+    }
+
+    @Config(minSdk = 21, maxSdk = 32)
+    @Test
+    fun skipPopulateStreamUseCaseStreamSpecOption_unsupportedOs() {
+        val jpegUseCase =
+            createUseCase(
+                UseCaseConfigFactory.CaptureType.IMAGE_CAPTURE,
+                streamUseCaseOverride = true
+            ) // JPEG
+        val useCaseExpectedResultMap = mutableMapOf<UseCase, Size>().apply {
+            put(jpegUseCase, landscapePixelArraySize)
+        }
+        val resultPair = getSuggestedSpecsAndVerify(
+            useCaseExpectedResultMap,
+        )
+        assertThat(resultPair.first.size).isEqualTo(1)
+        assertThat(
+            resultPair.first[jpegUseCase.currentConfig]!!.implementationOptions!!.containsOption(
+                StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+            )
+        ).isFalse()
+    }
+
     private fun setupCamera(
         hardwareLevel: Int = CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,
         sensorOrientation: Int = sensorOrientation90,
@@ -3048,6 +3193,20 @@
             }
         }
 
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
+        ) {
+            val uc = longArrayOf(
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT.toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL
+                    .toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL.toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+            characteristicsMap[CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES] = uc
+        }
+
         // set up FakeCafakeCameraMetadatameraMetadata
         fakeCameraMetadata = FakeCameraMetadata(
             cameraId = cameraId,
@@ -3238,7 +3397,16 @@
     private fun createUseCase(
         captureType: UseCaseConfigFactory.CaptureType,
         targetFrameRate: Range<Int>? = null,
-        dynamicRange: DynamicRange? = DynamicRange.UNSPECIFIED
+        dynamicRange: DynamicRange = DynamicRange.UNSPECIFIED
+    ): UseCase {
+        return createUseCase(captureType, targetFrameRate, dynamicRange, false)
+    }
+
+    private fun createUseCase(
+        captureType: UseCaseConfigFactory.CaptureType,
+        targetFrameRate: Range<Int>? = null,
+        dynamicRange: DynamicRange? = DynamicRange.UNSPECIFIED,
+        streamUseCaseOverride: Boolean
     ): UseCase {
         val builder = FakeUseCaseConfig.Builder(
             captureType, when (captureType) {
@@ -3254,6 +3422,12 @@
             ImageInputConfig.OPTION_INPUT_DYNAMIC_RANGE,
             dynamicRange
         )
+        if (streamUseCaseOverride) {
+            builder.mutableConfig.insertOption(
+                streamUseCaseOption,
+                streamUseCaseOverrideValue
+            )
+        }
         return builder.build()
     }
 
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/internal/StreamUseCaseTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/internal/StreamUseCaseTest.kt
new file mode 100644
index 0000000..67937d5
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/internal/StreamUseCaseTest.kt
@@ -0,0 +1,771 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.pipe.integration.internal
+
+import android.graphics.ImageFormat
+import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CameraMetadata
+import android.hardware.camera2.CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL
+import android.os.Build
+import android.view.Surface
+import androidx.camera.camera2.pipe.CameraId
+import androidx.camera.camera2.pipe.integration.adapter.SupportedSurfaceCombination
+import androidx.camera.camera2.pipe.integration.impl.Camera2ImplConfig
+import androidx.camera.camera2.pipe.testing.FakeCameraMetadata
+import androidx.camera.core.DynamicRange
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.ImageCapture.CaptureMode
+import androidx.camera.core.UseCase
+import androidx.camera.core.impl.AttachedSurfaceInfo
+import androidx.camera.core.impl.CameraMode
+import androidx.camera.core.impl.DeferrableSurface
+import androidx.camera.core.impl.ImageCaptureConfig
+import androidx.camera.core.impl.MutableOptionsBundle
+import androidx.camera.core.impl.SessionConfig
+import androidx.camera.core.impl.StreamSpec
+import androidx.camera.core.impl.SurfaceConfig
+import androidx.camera.core.impl.UseCaseConfig
+import androidx.camera.core.impl.UseCaseConfigFactory
+import androidx.camera.core.impl.UseCaseConfigFactory.CaptureType
+import androidx.camera.core.internal.utils.SizeUtil
+import androidx.camera.core.streamsharing.StreamSharing
+import androidx.camera.testing.fakes.FakeCamera
+import androidx.camera.testing.impl.fakes.FakeUseCase
+import androidx.camera.testing.impl.fakes.FakeUseCaseConfig
+import androidx.camera.testing.impl.fakes.FakeUseCaseConfigFactory
+import androidx.concurrent.futures.ResolvableFuture
+import com.google.common.util.concurrent.ListenableFuture
+import junit.framework.TestCase
+import org.junit.After
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@Config(minSdk = 33)
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+class StreamUseCaseTest() {
+    private val streamUseCaseOption: androidx.camera.core.impl.Config.Option<Long> =
+        androidx.camera.core.impl.Config.Option.create(
+            "camera2.cameraCaptureSession.streamUseCase",
+            Long::class.javaPrimitiveType!!
+        )
+
+    private var mMockSurface1: DeferrableSurface = object : DeferrableSurface() {
+        private val mSurfaceFuture: ListenableFuture<Surface> = ResolvableFuture.create()
+        override fun provideSurface(): ListenableFuture<Surface> {
+            // Return a never complete future.
+            return mSurfaceFuture
+        }
+    }
+    private var mMockSurface2: DeferrableSurface = object : DeferrableSurface() {
+        private val mSurfaceFuture: ListenableFuture<Surface> = ResolvableFuture.create()
+        override fun provideSurface(): ListenableFuture<Surface> {
+            // Return a never complete future.
+            return mSurfaceFuture
+        }
+    }
+
+    @After
+    fun tearDown() {
+        mMockSurface1.close()
+        mMockSurface2.close()
+    }
+
+    @Test
+    fun populateSurfaceToStreamUseCaseMapping_singlePreview() {
+        val streamUseCaseMap: MutableMap<DeferrableSurface, Long> = mutableMapOf()
+        val optionsBundle = MutableOptionsBundle.create()
+        optionsBundle.insertOption(
+            StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION,
+            CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+        )
+        val sessionConfig = SessionConfig.Builder()
+            .addSurface(mMockSurface1)
+            .addImplementationOptions(Camera2ImplConfig(optionsBundle))
+            .build()
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+        )
+        val sessionConfigs = mutableListOf(sessionConfig)
+        val useCaseConfigs = mutableListOf(useCaseConfig)
+        StreamUseCaseUtil.populateSurfaceToStreamUseCaseMapping(
+            sessionConfigs, useCaseConfigs,
+            streamUseCaseMap
+        )
+        TestCase.assertTrue(
+            streamUseCaseMap[mMockSurface1] ==
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+        )
+    }
+
+    @Test
+    fun populateSurfaceToStreamUseCaseMapping_imageCaptureAndMeteringRepeat() {
+        val streamUseCaseMap: MutableMap<DeferrableSurface, Long> = mutableMapOf()
+        val optionsBundle = MutableOptionsBundle.create()
+        optionsBundle.insertOption(
+            StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION,
+            CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+        )
+        val imageCaptureSessionConfig = SessionConfig.Builder()
+            .addSurface(mMockSurface1)
+            .addImplementationOptions(Camera2ImplConfig(optionsBundle))
+            .build()
+        val meteringRepeatingSessionConfig = SessionConfig.Builder()
+            .addSurface(mMockSurface2).build()
+        val imageCaptureConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.IMAGE_CAPTURE, imageFormat = ImageFormat.YUV_420_888
+        )
+        val meteringRepeatingConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = true,
+            isZslDisabled = false,
+            isZslCaptureMode = false,
+            captureType = CaptureType.METERING_REPEATING,
+            imageFormat = ImageFormat.PRIVATE
+        )
+        val sessionConfigs =
+            mutableListOf(imageCaptureSessionConfig, meteringRepeatingSessionConfig)
+        val useCaseConfigs = mutableListOf(imageCaptureConfig, meteringRepeatingConfig)
+        StreamUseCaseUtil.populateSurfaceToStreamUseCaseMapping(
+            sessionConfigs, useCaseConfigs,
+            streamUseCaseMap
+        )
+        TestCase.assertTrue(
+            streamUseCaseMap[mMockSurface1] ==
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong()
+        )
+        TestCase.assertTrue(
+            streamUseCaseMap[mMockSurface2] ==
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+        )
+    }
+
+    @Test
+    fun getStreamSpecImplementationOptions() {
+        val result: Camera2ImplConfig =
+            StreamUseCaseUtil.getStreamSpecImplementationOptions(
+                getFakeUseCaseConfigWithOptions(
+                    camera2InteropOverride = true,
+                    isZslDisabled = false,
+                    isZslCaptureMode = false,
+                    captureType = CaptureType.PREVIEW,
+                    imageFormat = ImageFormat.PRIVATE
+                )
+            )
+        TestCase.assertTrue(
+            result.retrieveOption(streamUseCaseOption)
+                == TEST_STREAM_USE_CASE_OPTION_VALUE
+        )
+        result.retrieveOption(UseCaseConfig.OPTION_ZSL_DISABLED)
+            ?.let { TestCase.assertFalse(it) }
+        TestCase.assertTrue(
+            (result.retrieveOption(ImageCaptureConfig.OPTION_IMAGE_CAPTURE_MODE)
+                == TEST_OPTION_IMAGE_CAPTURE_MODE_VALUE)
+        )
+        TestCase.assertTrue(
+            (result.retrieveOption(UseCaseConfig.OPTION_INPUT_FORMAT)
+                == ImageFormat.PRIVATE)
+        )
+    }
+
+    @Test
+    fun isStreamUseCaseSupported_streamUseCaseNotAvailable() {
+        TestCase.assertFalse(
+            StreamUseCaseUtil.isStreamUseCaseSupported(
+                getCameraMetadata(true)
+            )
+        )
+    }
+
+    @Test
+    fun shouldUseStreamUseCase_cameraModeNotSupported() {
+        TestCase.assertFalse(
+            StreamUseCaseUtil.shouldUseStreamUseCase(
+                SupportedSurfaceCombination.FeatureSettings(
+                    CameraMode.CONCURRENT_CAMERA,
+                    DynamicRange.BIT_DEPTH_8_BIT
+                )
+            )
+        )
+    }
+
+    @Test
+    fun shouldUseStreamUseCase_bitDepthNotSupported() {
+        TestCase.assertFalse(
+            StreamUseCaseUtil.shouldUseStreamUseCase(
+                SupportedSurfaceCombination.FeatureSettings(
+                    CameraMode.DEFAULT,
+                    DynamicRange.BIT_DEPTH_10_BIT
+                )
+            )
+        )
+    }
+
+    @Test
+    fun containsZslUseCase_isZslUseCase() {
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = true,
+            captureType = CaptureType.IMAGE_CAPTURE, imageFormat = ImageFormat.JPEG
+        )
+        val useCaseConfigList = mutableListOf(useCaseConfig)
+        TestCase.assertTrue(
+            StreamUseCaseUtil.containsZslUseCase(
+                listOf(), useCaseConfigList
+            )
+        )
+    }
+
+    @Test
+    fun containsZslUseCase_isZslUseCase_ZslDisabled() {
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = true, isZslDisabled = true, isZslCaptureMode = true,
+            captureType = CaptureType.IMAGE_CAPTURE, imageFormat = ImageFormat.JPEG
+        )
+        val useCaseConfigList = mutableListOf(useCaseConfig)
+        TestCase.assertFalse(
+            StreamUseCaseUtil.containsZslUseCase(
+                listOf(), useCaseConfigList
+            )
+        )
+    }
+
+    @Test
+    fun containsZslUseCase_isZslSurface() {
+        val attachedSurfaces = mutableListOf(
+            getFakeAttachedSurfaceInfo(
+                camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = true,
+                captureType = CaptureType.IMAGE_CAPTURE, imageFormat = ImageFormat.JPEG
+            )
+        )
+        TestCase.assertTrue(
+            StreamUseCaseUtil.containsZslUseCase(
+                attachedSurfaces,
+                listOf()
+            )
+        )
+    }
+
+    @Test
+    fun containsZslUseCase_isZslSurface_ZslDisabled() {
+        val attachedSurfaces = mutableListOf(
+            getFakeAttachedSurfaceInfo(
+                camera2InteropOverride = true, isZslDisabled = true, isZslCaptureMode = true,
+                captureType = CaptureType.IMAGE_CAPTURE, imageFormat = ImageFormat.JPEG
+            )
+        )
+        TestCase.assertFalse(
+            StreamUseCaseUtil.containsZslUseCase(
+                attachedSurfaces,
+                listOf()
+            )
+        )
+    }
+
+    @Test
+    fun populateStreamUseCaseStreamSpecOption_camera2InteropOverride_singleNewUseCase() {
+        val suggestedStreamSpecMap: MutableMap<UseCaseConfig<*>, StreamSpec> = mutableMapOf()
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+        )
+        suggestedStreamSpecMap[useCaseConfig] =
+            getFakeStreamSpecFromFakeUseCaseConfig(useCaseConfig)
+        StreamUseCaseUtil.populateStreamUseCaseStreamSpecOptionWithInteropOverride(
+            getCameraMetadata(false), ArrayList<AttachedSurfaceInfo>(), suggestedStreamSpecMap,
+            mutableMapOf()
+        )
+        TestCase.assertTrue(
+            suggestedStreamSpecMap[useCaseConfig]!!.implementationOptions!!.retrieveOption<Long>(
+                StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+            ) == TEST_STREAM_USE_CASE_OPTION_VALUE
+        )
+    }
+
+    @Test
+    fun populateStreamUseCaseStreamSpecOption_camera2InteropOverride_singleSurface() {
+        val attachedSurfaces: MutableList<AttachedSurfaceInfo> = mutableListOf(
+            getFakeAttachedSurfaceInfo(
+                camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = false,
+                captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+            )
+        )
+        val attachedSurfaceStreamSpecMap: MutableMap<AttachedSurfaceInfo, StreamSpec> = HashMap()
+        StreamUseCaseUtil.populateStreamUseCaseStreamSpecOptionWithInteropOverride(
+            getCameraMetadata(false), attachedSurfaces, mutableMapOf(),
+            attachedSurfaceStreamSpecMap
+        )
+        TestCase.assertTrue(
+            attachedSurfaceStreamSpecMap[attachedSurfaces[0]]!!
+                .implementationOptions!!.retrieveOption(
+                    StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+                ) == TEST_STREAM_USE_CASE_OPTION_VALUE
+        )
+    }
+
+    @Test
+    fun populateStreamUseCaseStreamSpecOption_camera2InteropOverride_useCaseAndSurface() {
+        val suggestedStreamSpecMap: MutableMap<UseCaseConfig<*>, StreamSpec> = mutableMapOf()
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+        )
+        suggestedStreamSpecMap[useCaseConfig] =
+            getFakeStreamSpecFromFakeUseCaseConfig(useCaseConfig)
+        val attachedSurfaces: MutableList<AttachedSurfaceInfo> = mutableListOf(
+            getFakeAttachedSurfaceInfo(
+                camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = false,
+                captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+            )
+        )
+        val attachedSurfaceStreamSpecMap: MutableMap<AttachedSurfaceInfo, StreamSpec> =
+            mutableMapOf()
+        StreamUseCaseUtil.populateStreamUseCaseStreamSpecOptionWithInteropOverride(
+            getCameraMetadata(false),
+            attachedSurfaces,
+            suggestedStreamSpecMap,
+            attachedSurfaceStreamSpecMap
+        )
+        TestCase.assertTrue(
+            suggestedStreamSpecMap[useCaseConfig]!!.implementationOptions!!.retrieveOption(
+                StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+            ) == TEST_STREAM_USE_CASE_OPTION_VALUE
+        )
+        TestCase.assertTrue(
+            attachedSurfaceStreamSpecMap[attachedSurfaces[0]]!!
+                .implementationOptions!!.retrieveOption(
+                    StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+                ) == TEST_STREAM_USE_CASE_OPTION_VALUE
+        )
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun populateStreamUseCaseStreamSpecOption_camera2InteropOverride_missingOverride() {
+        val suggestedStreamSpecMap: MutableMap<UseCaseConfig<*>, StreamSpec> = mutableMapOf()
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+        )
+        suggestedStreamSpecMap[useCaseConfig] =
+            getFakeStreamSpecFromFakeUseCaseConfig(useCaseConfig)
+        val attachedSurfaces: MutableList<AttachedSurfaceInfo> = mutableListOf(
+            getFakeAttachedSurfaceInfo(
+                camera2InteropOverride = true, isZslDisabled = false, isZslCaptureMode = false,
+                captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+            )
+        )
+        val attachedSurfaceStreamSpecMap: MutableMap<AttachedSurfaceInfo, StreamSpec> = HashMap()
+        StreamUseCaseUtil.populateStreamUseCaseStreamSpecOptionWithInteropOverride(
+            getCameraMetadata(false), attachedSurfaces, suggestedStreamSpecMap,
+            attachedSurfaceStreamSpecMap
+        )
+    }
+
+    @Test
+    fun areStreamUseCasesAvailableForSurfaceConfigs_success() {
+        val surfaceConfigList: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+            )
+        )
+        TestCase.assertTrue(
+            StreamUseCaseUtil.areStreamUseCasesAvailableForSurfaceConfigs(
+                getCameraMetadata(false), surfaceConfigList
+            )
+        )
+    }
+
+    @Test
+    fun areStreamUseCasesAvailableForSurfaceConfigs_fail() {
+        val surfaceConfigList: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+            )
+        )
+        TestCase.assertFalse(
+            StreamUseCaseUtil.areStreamUseCasesAvailableForSurfaceConfigs(
+                getCameraMetadata(true), surfaceConfigList
+            )
+        )
+    }
+
+    @Test
+    fun areCaptureTypesEligible_success() {
+        val surfaceConfigsWithStreamUseCase: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+            ), SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.RECORD,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+        )
+        val surfaceConfigAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo> = HashMap()
+        surfaceConfigAttachedSurfaceInfoMap[0] = getFakeAttachedSurfaceInfo(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+        )
+        val surfaceConfigUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>> = HashMap()
+        surfaceConfigUseCaseConfigMap[1] = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.VIDEO_CAPTURE, imageFormat = ImageFormat.PRIVATE
+        )
+        TestCase.assertTrue(
+            StreamUseCaseUtil.areCaptureTypesEligible(
+                surfaceConfigAttachedSurfaceInfoMap,
+                surfaceConfigUseCaseConfigMap, surfaceConfigsWithStreamUseCase
+            )
+        )
+    }
+
+    @Test
+    fun areCaptureTypesEligible_fail() {
+        val surfaceConfigsWithStreamUseCase: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+            ), SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.RECORD,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+        )
+        val surfaceConfigAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo> = HashMap()
+        surfaceConfigAttachedSurfaceInfoMap[0] = getFakeAttachedSurfaceInfo(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+        )
+        val surfaceConfigUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>> = HashMap()
+        surfaceConfigUseCaseConfigMap[1] = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+        )
+        TestCase.assertFalse(
+            StreamUseCaseUtil.areCaptureTypesEligible(
+                surfaceConfigAttachedSurfaceInfoMap,
+                surfaceConfigUseCaseConfigMap, surfaceConfigsWithStreamUseCase
+            )
+        )
+    }
+
+    @Test(expected = AssertionError::class)
+    fun areCaptureTypesEligible_mappingError() {
+        val surfaceConfigsWithStreamUseCase: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+            ), SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.RECORD,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+        )
+        val surfaceConfigAttachedSurfaceInfoMap: Map<Int, AttachedSurfaceInfo> = HashMap()
+        val surfaceConfigUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>> = HashMap()
+        surfaceConfigUseCaseConfigMap[1] = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.VIDEO_CAPTURE, imageFormat = ImageFormat.PRIVATE
+        )
+        StreamUseCaseUtil.areCaptureTypesEligible(
+            surfaceConfigAttachedSurfaceInfoMap,
+            surfaceConfigUseCaseConfigMap, surfaceConfigsWithStreamUseCase
+        )
+    }
+
+    @Test
+    fun areCaptureTypesEligible_streamSharing_previewVideoStill_success() {
+        val surfaceConfigsWithStreamUseCase: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL.toLong()
+            )
+        )
+        val useCaseConfigFactory: UseCaseConfigFactory = FakeUseCaseConfigFactory()
+        val children: MutableSet<UseCase> = mutableSetOf(
+            FakeUseCase(
+                FakeUseCaseConfig.Builder().useCaseConfig,
+                CaptureType.PREVIEW
+            ), FakeUseCase(
+                FakeUseCaseConfig.Builder().useCaseConfig,
+                CaptureType.IMAGE_CAPTURE
+            ), FakeUseCase(
+                FakeUseCaseConfig.Builder().useCaseConfig,
+                CaptureType.VIDEO_CAPTURE
+            )
+        )
+        val streamSharing = StreamSharing(
+            FakeCamera(), children,
+            useCaseConfigFactory
+        )
+        val surfaceConfigAttachedSurfaceInfoMap: Map<Int, AttachedSurfaceInfo> = mutableMapOf()
+        val surfaceConfigUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>> = mutableMapOf()
+        surfaceConfigUseCaseConfigMap[0] =
+            streamSharing.getDefaultConfig(true, useCaseConfigFactory)!!
+        TestCase.assertTrue(
+            StreamUseCaseUtil.areCaptureTypesEligible(
+                surfaceConfigAttachedSurfaceInfoMap,
+                surfaceConfigUseCaseConfigMap, surfaceConfigsWithStreamUseCase
+            )
+        )
+    }
+
+    @Test
+    fun areCaptureTypesEligible_streamSharing_videoRecord_success() {
+        val surfaceConfigsWithStreamUseCase: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+        )
+        val surfaceConfigAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo> =
+            mutableMapOf()
+        val surfaceConfigUseCaseConfigMap: Map<Int, UseCaseConfig<*>> = mutableMapOf()
+        val captureTypes: MutableList<CaptureType> = ArrayList()
+        captureTypes.add(CaptureType.PREVIEW)
+        captureTypes.add(CaptureType.VIDEO_CAPTURE)
+        surfaceConfigAttachedSurfaceInfoMap[0] = AttachedSurfaceInfo.create(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV,
+                SurfaceConfig.ConfigSize.PREVIEW
+            ),
+            ImageFormat.PRIVATE,
+            SizeUtil.RESOLUTION_720P,
+            DynamicRange.SDR,
+            captureTypes, /*implementationOptions=*/
+            null, /*targetFrameRate=*/
+            null
+        )
+        TestCase.assertTrue(
+            StreamUseCaseUtil.areCaptureTypesEligible(
+                surfaceConfigAttachedSurfaceInfoMap,
+                surfaceConfigUseCaseConfigMap, surfaceConfigsWithStreamUseCase
+            )
+        )
+    }
+
+    @Test
+    fun areCaptureTypesEligible_streamSharing_fail() {
+        val surfaceConfigsWithStreamUseCase: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+        )
+        val surfaceConfigAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo> =
+            mutableMapOf()
+        val surfaceConfigUseCaseConfigMap: Map<Int, UseCaseConfig<*>> = mutableMapOf()
+        val captureTypes: MutableList<CaptureType> =
+            mutableListOf(CaptureType.PREVIEW, CaptureType.IMAGE_CAPTURE, CaptureType.VIDEO_CAPTURE)
+        surfaceConfigAttachedSurfaceInfoMap[0] = AttachedSurfaceInfo.create(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV,
+                SurfaceConfig.ConfigSize.PREVIEW
+            ),
+            ImageFormat.PRIVATE,
+            SizeUtil.RESOLUTION_720P,
+            DynamicRange.SDR,
+            captureTypes, /*implementationOptions=*/
+            null, /*targetFrameRate=*/
+            null
+        )
+        TestCase.assertFalse(
+            StreamUseCaseUtil.areCaptureTypesEligible(
+                surfaceConfigAttachedSurfaceInfoMap,
+                surfaceConfigUseCaseConfigMap, surfaceConfigsWithStreamUseCase
+            )
+        )
+    }
+
+    @Test
+    fun populateStreamUseCaseStreamSpecOptionWithSupportedSurfaceConfigs_success() {
+        val surfaceConfigsWithStreamUseCase: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+            ), SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.RECORD,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+        )
+        val surfaceConfigAttachedSurfaceInfoMap: MutableMap<Int, AttachedSurfaceInfo> =
+            mutableMapOf()
+        val attachedSurfaceInfo = getFakeAttachedSurfaceInfo(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.PREVIEW, imageFormat = ImageFormat.PRIVATE
+        )
+        surfaceConfigAttachedSurfaceInfoMap[0] = attachedSurfaceInfo
+        val surfaceConfigUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>> = mutableMapOf()
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.VIDEO_CAPTURE, imageFormat = ImageFormat.PRIVATE
+        )
+        surfaceConfigUseCaseConfigMap[1] = useCaseConfig
+        val attachedSurfaceStreamSpecMap: MutableMap<AttachedSurfaceInfo, StreamSpec> =
+            mutableMapOf()
+        val suggestedStreamSpecMap: MutableMap<UseCaseConfig<*>, StreamSpec> = mutableMapOf()
+        suggestedStreamSpecMap[useCaseConfig] =
+            getFakeStreamSpecFromFakeUseCaseConfig(useCaseConfig)
+        StreamUseCaseUtil.populateStreamUseCaseStreamSpecOptionWithSupportedSurfaceConfigs(
+            suggestedStreamSpecMap, attachedSurfaceStreamSpecMap,
+            surfaceConfigAttachedSurfaceInfoMap,
+            surfaceConfigUseCaseConfigMap, surfaceConfigsWithStreamUseCase
+        )
+        TestCase.assertTrue(
+            (attachedSurfaceStreamSpecMap[attachedSurfaceInfo]!!.implementationOptions!!
+                .retrieveOption(
+                    StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+                )
+                == CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong())
+        )
+        TestCase.assertTrue(
+            (suggestedStreamSpecMap[useCaseConfig]!!.implementationOptions!!.retrieveOption(
+                StreamUseCaseUtil.STREAM_USE_CASE_STREAM_SPEC_OPTION
+            )
+                == CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong())
+        )
+    }
+
+    @Test(expected = AssertionError::class)
+    fun populateStreamUseCaseStreamSpecOptionWithSupportedSurfaceConfigs_mappingError() {
+        val surfaceConfigsWithStreamUseCase: MutableList<SurfaceConfig> = mutableListOf(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.PREVIEW,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+            ), SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV, SurfaceConfig.ConfigSize.RECORD,
+                CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+        )
+        val surfaceConfigAttachedSurfaceInfoMap: Map<Int, AttachedSurfaceInfo> = HashMap()
+        val surfaceConfigUseCaseConfigMap: MutableMap<Int, UseCaseConfig<*>> = HashMap()
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride = false, isZslDisabled = false, isZslCaptureMode = false,
+            captureType = CaptureType.VIDEO_CAPTURE, imageFormat = ImageFormat.PRIVATE
+        )
+        surfaceConfigUseCaseConfigMap[1] = useCaseConfig
+        val attachedSurfaceStreamSpecMap: MutableMap<AttachedSurfaceInfo, StreamSpec> = HashMap()
+        val suggestedStreamSpecMap: MutableMap<UseCaseConfig<*>, StreamSpec> = HashMap()
+        suggestedStreamSpecMap[useCaseConfig] =
+            getFakeStreamSpecFromFakeUseCaseConfig(useCaseConfig)
+        StreamUseCaseUtil.populateStreamUseCaseStreamSpecOptionWithSupportedSurfaceConfigs(
+            suggestedStreamSpecMap, attachedSurfaceStreamSpecMap,
+            surfaceConfigAttachedSurfaceInfoMap,
+            surfaceConfigUseCaseConfigMap, surfaceConfigsWithStreamUseCase
+        )
+    }
+
+    private fun getFakeUseCaseConfigWithOptions(
+        camera2InteropOverride: Boolean,
+        isZslDisabled: Boolean,
+        isZslCaptureMode: Boolean,
+        captureType: CaptureType,
+        imageFormat: Int
+    ): UseCaseConfig<*> {
+        val fakeUseCaseConfigBuilder = FakeUseCaseConfig.Builder(
+            captureType
+        )
+        val fakeConfig = fakeUseCaseConfigBuilder.mutableConfig
+        if (camera2InteropOverride) {
+            fakeConfig.insertOption(
+                streamUseCaseOption,
+                TEST_STREAM_USE_CASE_OPTION_VALUE
+            )
+        }
+        fakeConfig.insertOption(UseCaseConfig.OPTION_ZSL_DISABLED, isZslDisabled)
+        fakeConfig.insertOption(
+            ImageCaptureConfig.OPTION_IMAGE_CAPTURE_MODE,
+            if (isZslCaptureMode) ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG
+            else TEST_OPTION_IMAGE_CAPTURE_MODE_VALUE
+        )
+        fakeConfig.insertOption(ImageCaptureConfig.OPTION_INPUT_FORMAT, imageFormat)
+        return fakeUseCaseConfigBuilder.useCaseConfig
+    }
+
+    private fun getFakeAttachedSurfaceInfo(
+        camera2InteropOverride: Boolean,
+        isZslDisabled: Boolean,
+        isZslCaptureMode: Boolean,
+        captureType: CaptureType,
+        imageFormat: Int
+    ): AttachedSurfaceInfo {
+        val useCaseConfig = getFakeUseCaseConfigWithOptions(
+            camera2InteropOverride,
+            isZslDisabled, isZslCaptureMode, captureType, imageFormat
+        )
+        val captureTypes: MutableList<CaptureType> = ArrayList()
+        captureTypes.add(useCaseConfig.captureType)
+        return AttachedSurfaceInfo.create(
+            SurfaceConfig.create(
+                SurfaceConfig.ConfigType.PRIV,
+                SurfaceConfig.ConfigSize.PREVIEW
+            ),
+            useCaseConfig.inputFormat,
+            SizeUtil.RESOLUTION_720P,
+            DynamicRange.SDR,
+            captureTypes,
+            StreamUseCaseUtil.getStreamSpecImplementationOptions(
+                useCaseConfig
+            ),
+            null /*targetFrameRate=*/
+        )
+    }
+
+    private fun getFakeStreamSpecFromFakeUseCaseConfig(fakeUseCaseConfig: UseCaseConfig<*>):
+        StreamSpec {
+        return StreamSpec.builder(SizeUtil.RESOLUTION_720P)
+            .setDynamicRange(DynamicRange.UNSPECIFIED)
+            .setImplementationOptions(
+                StreamUseCaseUtil.getStreamSpecImplementationOptions(
+                    fakeUseCaseConfig
+                )
+            ).build()
+    }
+
+    private fun getCameraMetadata(
+        noAvailableStreamUseCase: Boolean
+    ): androidx.camera.camera2.pipe.CameraMetadata {
+        val characteristicsMap: MutableMap<CameraCharacteristics.Key<*>, Any?> = mutableMapOf()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !noAvailableStreamUseCase) {
+            val uc = longArrayOf(
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT.toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong(),
+                SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL.toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE.toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL.toLong(),
+                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD.toLong()
+            )
+            characteristicsMap[CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES] = uc
+        }
+        return FakeCameraMetadata(
+            cameraId = CameraId.fromCamera2Id(CAMERA_ID_0),
+            characteristics = characteristicsMap
+        )
+    }
+
+    companion object {
+        private const val CAMERA_ID_0 = "0"
+        private const val TEST_STREAM_USE_CASE_OPTION_VALUE =
+            CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW.toLong()
+
+        @CaptureMode
+        private val TEST_OPTION_IMAGE_CAPTURE_MODE_VALUE =
+            ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY
+    }
+}
diff --git a/camera/camera-camera2-pipe-testing/lint-baseline.xml b/camera/camera-camera2-pipe-testing/lint-baseline.xml
new file mode 100644
index 0000000..fd988ca
--- /dev/null
+++ b/camera/camera-camera2-pipe-testing/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/testing/FakeImage.kt"/>
+    </issue>
+
+</issues>
diff --git a/camera/camera-camera2-pipe/lint-baseline.xml b/camera/camera-camera2-pipe/lint-baseline.xml
index 296ac95..de258ca 100644
--- a/camera/camera-camera2-pipe/lint-baseline.xml
+++ b/camera/camera-camera2-pipe/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
@@ -10,4 +10,22 @@
             file="src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/media/ImageWrapper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/media/OutputImage.kt"/>
+    </issue>
+
 </issues>
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
index 1a79267..923e44a 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
@@ -20,6 +20,7 @@
 import static android.hardware.camera2.CameraMetadata.CONTROL_AE_MODE_ON;
 import static android.hardware.camera2.CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH;
 import static android.hardware.camera2.CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH;
+import static android.hardware.camera2.CameraMetadata.CONTROL_AE_MODE_ON_EXTERNAL_FLASH;
 import static android.hardware.camera2.CameraMetadata.CONTROL_AF_MODE_AUTO;
 import static android.hardware.camera2.CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
 import static android.hardware.camera2.CameraMetadata.CONTROL_AF_MODE_OFF;
@@ -30,9 +31,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeThat;
 import static org.junit.Assume.assumeTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
@@ -133,25 +136,29 @@
 
     @Before
     public void setUp() throws InterruptedException {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
+        mHandlerThread = new HandlerThread("ControlThread");
+        mHandlerThread.start();
+        mHandler = HandlerCompat.createAsync(mHandlerThread.getLooper());
 
         Context context = ApplicationProvider.getApplicationContext();
         CameraXConfig config = Camera2Config.defaultConfig();
         CameraXUtil.initialize(context, config);
 
-        mCameraCharacteristics = CameraUtil.getCameraCharacteristics(
-                CameraSelector.LENS_FACING_BACK);
+        setUp(CameraSelector.LENS_FACING_BACK);
+    }
+
+    private void setUp(int lensFacing) throws InterruptedException {
+        assumeTrue(CameraUtil.hasCameraWithLensFacing(lensFacing));
+
+        mCameraCharacteristics = CameraUtil.getCameraCharacteristics(lensFacing);
         Boolean hasFlashUnit =
                 mCameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
         mHasFlashUnit = hasFlashUnit != null && hasFlashUnit.booleanValue();
 
         mControlUpdateCallback = mock(CameraControlInternal.ControlUpdateCallback.class);
-        mHandlerThread = new HandlerThread("ControlThread");
-        mHandlerThread.start();
-        mHandler = HandlerCompat.createAsync(mHandlerThread.getLooper());
 
         ScheduledExecutorService executorService = CameraXExecutors.newHandlerExecutor(mHandler);
-        String cameraId = CameraUtil.getCameraIdWithLensFacing(CameraSelector.LENS_FACING_BACK);
+        String cameraId = CameraUtil.getCameraIdWithLensFacing(lensFacing);
         mCameraCharacteristicsCompat = CameraCharacteristicsCompat.toCameraCharacteristicsCompat(
                 mCameraCharacteristics, cameraId);
         mCamera2CameraControlImpl = new Camera2CameraControlImpl(mCameraCharacteristicsCompat,
@@ -331,6 +338,53 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 28)
+    public void enableExternalFlashAeMode_aeModeSetAndRequestUpdated() throws InterruptedException {
+        setUp(CameraSelector.LENS_FACING_FRONT);
+
+        assumeThat("CONTROL_AE_MODE_ON_EXTERNAL_FLASH not supported",
+                mCamera2CameraControlImpl.getSupportedAeMode(CONTROL_AE_MODE_ON_EXTERNAL_FLASH),
+                equalTo(CONTROL_AE_MODE_ON_EXTERNAL_FLASH));
+
+        mCamera2CameraControlImpl.getFocusMeteringControl().enableExternalFlashAeMode(true);
+
+        HandlerUtil.waitForLooperToIdle(mHandler);
+
+        verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig();
+        SessionConfig sessionConfig = mCamera2CameraControlImpl.getSessionConfig();
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
+
+        assertAeMode(camera2Config, CONTROL_AE_MODE_ON_EXTERNAL_FLASH);
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 28)
+    public void disableExternalFlashAeMode_aeModeUnsetAndRequestUpdated()
+            throws InterruptedException {
+        setUp(CameraSelector.LENS_FACING_FRONT);
+
+        assumeThat("CONTROL_AE_MODE_ON_EXTERNAL_FLASH not supported",
+                mCamera2CameraControlImpl.getSupportedAeMode(CONTROL_AE_MODE_ON_EXTERNAL_FLASH),
+                equalTo(CONTROL_AE_MODE_ON_EXTERNAL_FLASH));
+
+        mCamera2CameraControlImpl.getFocusMeteringControl().enableExternalFlashAeMode(true);
+        HandlerUtil.waitForLooperToIdle(mHandler);
+
+        mCamera2CameraControlImpl.getFocusMeteringControl().enableExternalFlashAeMode(false);
+
+        HandlerUtil.waitForLooperToIdle(mHandler);
+
+        verify(mControlUpdateCallback, times(2)).onCameraControlUpdateSessionConfig();
+        SessionConfig sessionConfig = mCamera2CameraControlImpl.getSessionConfig();
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
+
+        assertThat(camera2Config.getCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE,
+                null)).isNotEqualTo(CONTROL_AE_MODE_ON_EXTERNAL_FLASH);
+    }
+
+    @Test
     public void enableTorch_aeModeSetAndRequestUpdated() throws InterruptedException {
         assumeTrue(mHasFlashUnit);
         mCamera2CameraControlImpl.enableTorch(true);
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraControlImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraControlImpl.java
index c925ee0..edefc0f 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraControlImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraControlImpl.java
@@ -48,6 +48,7 @@
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.FocusMeteringResult;
 import androidx.camera.core.ImageCapture;
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl;
 import androidx.camera.core.Logger;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CameraCaptureFailure;
@@ -131,6 +132,9 @@
     private final Camera2CapturePipeline mCamera2CapturePipeline;
     @GuardedBy("mLock")
     private int mUseCount = 0;
+
+    private ScreenFlashUiControl mScreenFlashUiControl;
+
     // use volatile modifier to make these variables in sync in all threads.
     private volatile boolean mIsTorchOn = false;
     @ImageCapture.FlashMode
@@ -208,7 +212,7 @@
         mAutoFlashAEModeDisabler = new AutoFlashAEModeDisabler(cameraQuirks);
         mCamera2CameraControl = new Camera2CameraControl(this, mExecutor);
         mCamera2CapturePipeline = new Camera2CapturePipeline(this, mCameraCharacteristics,
-                cameraQuirks, mExecutor);
+                cameraQuirks, mExecutor, scheduler);
         mExecutor.execute(
                 () -> addCaptureResultListener(mCamera2CameraControl.getCaptureRequestListener()));
     }
@@ -313,6 +317,9 @@
         mTorchControl.setActive(isActive);
         mExposureControl.setActive(isActive);
         mCamera2CameraControl.setActive(isActive);
+        if (!isActive) {
+            mScreenFlashUiControl = null;
+        }
     }
 
     @ExecutedBy("mExecutor")
@@ -388,6 +395,17 @@
         mFlashModeChangeSessionUpdateFuture = updateSessionConfigAsync();
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public void setScreenFlashUiControl(@Nullable ScreenFlashUiControl screenFlashUiControl) {
+        mScreenFlashUiControl = screenFlashUiControl;
+    }
+
+    @Nullable
+    public ScreenFlashUiControl getScreenFlashUiControl() {
+        return mScreenFlashUiControl;
+    }
+
     @Override
     public void addZslConfig(@NonNull SessionConfig.Builder sessionConfigBuilder) {
         mZslControl.addZslConfig(sessionConfigBuilder);
@@ -652,6 +670,8 @@
         if (mIsTorchOn) {
             builder.setCaptureRequestOptionWithPriority(CaptureRequest.FLASH_MODE,
                     CaptureRequest.FLASH_MODE_TORCH, Config.OptionPriority.REQUIRED);
+        } else if (mFocusMeteringControl.isExternalFlashAeModeEnabled()) {
+            aeMode = CaptureRequest.CONTROL_AE_MODE_ON_EXTERNAL_FLASH;
         } else {
             switch (mFlashMode) {
                 case FLASH_MODE_OFF:
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CapturePipeline.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CapturePipeline.java
index 7da2f82..247473c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CapturePipeline.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CapturePipeline.java
@@ -23,6 +23,7 @@
 import static androidx.camera.core.ImageCapture.FLASH_MODE_AUTO;
 import static androidx.camera.core.ImageCapture.FLASH_MODE_OFF;
 import static androidx.camera.core.ImageCapture.FLASH_MODE_ON;
+import static androidx.camera.core.ImageCapture.FLASH_MODE_SCREEN;
 import static androidx.camera.core.ImageCapture.FLASH_TYPE_USE_TORCH_AS_FLASH;
 import static androidx.camera.core.ImageCapture.FlashMode;
 import static androidx.camera.core.ImageCapture.FlashType;
@@ -34,6 +35,7 @@
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
+import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -47,6 +49,7 @@
 import androidx.camera.camera2.internal.compat.workaround.OverrideAeModeForStillCapture;
 import androidx.camera.camera2.internal.compat.workaround.UseTorchAsFlash;
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
+import androidx.camera.core.ImageCapture;
 import androidx.camera.core.ImageCaptureException;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.Logger;
@@ -70,9 +73,12 @@
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Implementation detail of the submitStillCaptures method.
@@ -137,6 +143,9 @@
     @CameraExecutor
     private final Executor mExecutor;
 
+    @NonNull
+    private final ScheduledExecutorService mScheduler;
+
     private final boolean mIsLegacyDevice;
 
     private int mTemplate = CameraDevice.TEMPLATE_PREVIEW;
@@ -147,13 +156,15 @@
     Camera2CapturePipeline(@NonNull Camera2CameraControlImpl cameraControl,
             @NonNull CameraCharacteristicsCompat cameraCharacteristics,
             @NonNull Quirks cameraQuirks,
-            @CameraExecutor @NonNull Executor executor) {
+            @CameraExecutor @NonNull Executor executor,
+            @NonNull ScheduledExecutorService scheduler) {
         mCameraControl = cameraControl;
         Integer level =
                 cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
         mIsLegacyDevice = level != null
                 && level == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
         mExecutor = executor;
+        mScheduler = scheduler;
         mCameraQuirk = cameraQuirks;
         mUseTorchAsFlash = new UseTorchAsFlash(cameraQuirks);
         mHasFlashUnit = FlashAvailabilityChecker.isFlashAvailable(cameraCharacteristics::get);
@@ -187,13 +198,19 @@
             pipeline.addTask(new AfTask(mCameraControl));
         }
 
-        if (mHasFlashUnit) {
-            if (isTorchAsFlash(flashType)) {
-                pipeline.addTask(new TorchTask(mCameraControl, flashMode, mExecutor));
-            } else {
-                pipeline.addTask(new AePreCaptureTask(mCameraControl, flashMode, aeQuirk));
+        if (flashMode == FLASH_MODE_SCREEN) {
+            pipeline.addTask(new ScreenFlashTask(mCameraControl, mExecutor, mScheduler));
+        } else {
+            if (mHasFlashUnit) {
+                if (isTorchAsFlash(flashType)) {
+                    pipeline.addTask(new TorchTask(mCameraControl, flashMode, mExecutor));
+                } else {
+                    pipeline.addTask(new AePreCaptureTask(mCameraControl, flashMode, aeQuirk));
+                }
             }
-        } // If there is no flash unit, skip the flash related task instead of failing the pipeline.
+            // If there is no flash unit, skip the flash related task instead of failing the
+            // pipeline.
+        }
 
         return Futures.nonCancellationPropagating(
                 pipeline.executeCapture(captureConfigs, flashMode));
@@ -657,8 +674,95 @@
         }
     }
 
+    /**
+     * Task to trigger ScreenFlashCallback and AePreCapture if screen flash is enabled.
+     */
+    static class ScreenFlashTask implements PipelineTask {
+        private static final long CHECK_3A_WITH_SCREEN_FLASH_TIMEOUT_IN_NS =
+                TimeUnit.SECONDS.toNanos(2);
+
+        private final Camera2CameraControlImpl mCameraControl;
+        private final Executor mExecutor;
+        private final ScheduledExecutorService mScheduler;
+        private final ImageCapture.ScreenFlashUiControl mScreenFlashUiControl;
+
+        ScreenFlashTask(@NonNull Camera2CameraControlImpl cameraControl,
+                @NonNull Executor executor, @NonNull ScheduledExecutorService scheduler) {
+            mCameraControl = cameraControl;
+            mExecutor = executor;
+            mScheduler = scheduler;
+
+            mScreenFlashUiControl =
+                    Objects.requireNonNull(mCameraControl.getScreenFlashUiControl());
+        }
+
+        @ExecutedBy("mExecutor")
+        @NonNull
+        @Override
+        public ListenableFuture<Boolean> preCapture(@Nullable TotalCaptureResult captureResult) {
+            Logger.d(TAG, "ScreenFlashTask#preCapture");
+
+            AtomicReference<ImageCapture.ScreenFlashUiCompleter> screenFlashUiCompleter =
+                    new AtomicReference<>();
+
+            ListenableFuture<Void> uiAppliedFuture = CallbackToFutureAdapter.getFuture(
+                    completer -> {
+                        screenFlashUiCompleter.set(() -> {
+                            Logger.d(TAG, "ScreenFlashTask#preCapture: UI change applied");
+                            completer.set(null);
+                        });
+                        return "OnScreenFlashUiApplied";
+                    });
+
+            ListenableFuture<Void> future = CallbackToFutureAdapter.getFuture(completer -> {
+                CameraXExecutors.mainThreadExecutor().execute(() -> {
+                    mScreenFlashUiControl.applyScreenFlashUi(screenFlashUiCompleter.get());
+                    completer.set(null);
+                });
+                return "OnScreenFlashStart";
+            });
+
+            return FutureChain.from(future).transformAsync(
+                    input -> mCameraControl.getFocusMeteringControl().enableExternalFlashAeMode(
+                            true),
+                    mExecutor
+            ).transformAsync(
+                    input -> Futures.makeTimeoutFuture(TimeUnit.SECONDS.toMillis(
+                                    ImageCapture.SCREEN_FLASH_UI_APPLY_TIMEOUT_SECONDS),
+                            mScheduler, null,
+                            uiAppliedFuture),
+                    mExecutor
+            ).transformAsync(
+                    input -> mCameraControl.getFocusMeteringControl().triggerAePrecapture(),
+                    mExecutor
+            ).transformAsync(
+                    input -> waitForResult(CHECK_3A_WITH_SCREEN_FLASH_TIMEOUT_IN_NS, mCameraControl,
+                            (result) -> is3AConverged(result, false)), mExecutor
+            ).transform(input -> false, CameraXExecutors.directExecutor());
+        }
+
+        @ExecutedBy("mExecutor")
+        @Override
+        public boolean isCaptureResultNeeded() {
+            return false;
+        }
+
+        @ExecutedBy("mExecutor")
+        @Override
+        public void postCapture() {
+            Logger.d(TAG, "ScreenFlashTask#postCapture");
+            mCameraControl.getFocusMeteringControl().enableExternalFlashAeMode(false).addListener(
+                    () -> Log.d(TAG, "enableExternalFlashAeMode disabled"), mExecutor
+            );
+            mCameraControl.getFocusMeteringControl().cancelAfAeTrigger(false, true);
+            CameraXExecutors.mainThreadExecutor().execute(
+                    mScreenFlashUiControl::clearScreenFlashUi);
+        }
+    }
+
     static boolean isFlashRequired(@FlashMode int flashMode, @Nullable TotalCaptureResult result) {
         switch (flashMode) {
+            case FLASH_MODE_SCREEN:
             case FLASH_MODE_ON:
                 return true;
             case FLASH_MODE_AUTO:
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/FocusMeteringControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/FocusMeteringControl.java
index 3be2577..bce552b 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/FocusMeteringControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/FocusMeteringControl.java
@@ -18,11 +18,13 @@
 
 import android.graphics.PointF;
 import android.graphics.Rect;
+import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.params.MeteringRectangle;
 import android.os.Build;
+import android.util.Log;
 import android.util.Rational;
 
 import androidx.annotation.NonNull;
@@ -37,6 +39,7 @@
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.FocusMeteringResult;
+import androidx.camera.core.Logger;
 import androidx.camera.core.MeteringPoint;
 import androidx.camera.core.impl.CameraCaptureCallback;
 import androidx.camera.core.impl.CameraCaptureFailure;
@@ -46,6 +49,7 @@
 import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.Quirks;
 import androidx.camera.core.impl.annotation.ExecutedBy;
+import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
 
@@ -82,6 +86,8 @@
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @OptIn(markerClass = ExperimentalCamera2Interop.class)
 class FocusMeteringControl {
+    private static final String TAG = "FocusMeteringControl";
+
     static final long AUTO_FOCUS_TIMEOUT_DURATION = 5000;
     private final Camera2CameraControlImpl mCameraControl;
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -116,6 +122,9 @@
     private MeteringRectangle[] mAwbRects = EMPTY_RECTANGLES;
     CallbackToFutureAdapter.Completer<FocusMeteringResult> mRunningActionCompleter = null;
     CallbackToFutureAdapter.Completer<Void> mRunningCancelCompleter = null;
+
+    private boolean mIsExternalFlashAeModeEnabled = false;
+    private Camera2CameraControlImpl.CaptureResultListener mSessionListenerForAeMode = null;
     //**************************************************************************************//
 
 
@@ -427,6 +436,18 @@
     }
 
     /**
+     * Returns a {@link ListenableFuture} as result after triggering AE precapture.
+     */
+    ListenableFuture<Void> triggerAePrecapture() {
+        return CallbackToFutureAdapter.getFuture(completer -> {
+            mExecutor.execute(() -> {
+                triggerAePrecapture(completer);
+            });
+            return "triggerAePrecapture";
+        });
+    }
+
+    /**
      * Trigger an AE precapture sequence.
      *
      * @param completer used to complete the associated {@link ListenableFuture} when the
@@ -453,6 +474,7 @@
             @Override
             public void onCaptureCompleted(@NonNull CameraCaptureResult cameraCaptureResult) {
                 if (completer != null) {
+                    Logger.d(TAG, "triggerAePrecapture: triggering capture request completed");
                     completer.set(null);
                 }
             }
@@ -500,6 +522,98 @@
         mCameraControl.submitCaptureRequestsInternal(Collections.singletonList(builder.build()));
     }
 
+    /**
+     * Returns whether external flash AE mode is enabled.
+     *
+     * @see #enableExternalFlashAeMode
+     */
+    boolean isExternalFlashAeModeEnabled() {
+        return mIsExternalFlashAeModeEnabled;
+    }
+
+    /**
+     * Enables or disables AE_MODE_ON_EXTERNAL_FLASH.
+     *
+     * <p> It will be enabled only if the AE mode is supported i.e. API >= 28 and available in
+     * {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_MODES}.
+     *
+     * @param enable Whether to enable or disable the AE mode.
+     * @return A {@link ListenableFuture} that is completed when the capture request to set the
+     *         AE mode has been processed in framework side.
+     */
+    ListenableFuture<Void> enableExternalFlashAeMode(boolean enable) {
+        if (Build.VERSION.SDK_INT < 28) {
+            Log.d(TAG, "CONTROL_AE_MODE_ON_EXTERNAL_FLASH is not supported in API "
+                    + Build.VERSION.SDK_INT);
+            return Futures.immediateFuture(null);
+        }
+
+        if (mCameraControl.getSupportedAeMode(CaptureRequest.CONTROL_AE_MODE_ON_EXTERNAL_FLASH)
+                != CaptureRequest.CONTROL_AE_MODE_ON_EXTERNAL_FLASH) {
+            Log.d(TAG, "CONTROL_AE_MODE_ON_EXTERNAL_FLASH is not supported in this device");
+            return Futures.immediateFuture(null);
+        }
+
+        Log.d(TAG, "enableExternalFlashAeMode: CONTROL_AE_MODE_ON_EXTERNAL_FLASH supported");
+
+        return CallbackToFutureAdapter.getFuture(completer -> {
+            mExecutor.execute(() -> {
+                mCameraControl.removeCaptureResultListener(mSessionListenerForAeMode);
+                mIsExternalFlashAeModeEnabled = enable;
+                enableExternalFlashAeMode(completer);
+            });
+            return "enableExternalFlashAeMode";
+        });
+    }
+
+    /**
+     * Enables or disables AE_MODE_ON_EXTERNAL_FLASH.
+     *
+     * @param completer used to complete the associated {@link ListenableFuture} when the
+     *                  operation succeeds or fails. Passing null to simply ignore the result.
+     *
+     * @see #enableExternalFlashAeMode
+     */
+    @RequiresApi(28)
+    @ExecutedBy("mExecutor")
+    private void enableExternalFlashAeMode(@Nullable Completer<Void> completer) {
+        if (!mIsActive) {
+            if (completer != null) {
+                completer.setException(
+                        new CameraControl.OperationCanceledException("Camera is not active."));
+            }
+            return;
+        }
+
+        long sessionUpdateId = mCameraControl.updateSessionConfigSynchronous();
+
+        // Will be called on mExecutor since mSessionCallback was created with mExecutor
+        mSessionListenerForAeMode =
+                result -> {
+                    boolean isAeModeExternalFlash = result.get(CaptureResult.CONTROL_AE_MODE)
+                            == CaptureRequest.CONTROL_AE_MODE_ON_EXTERNAL_FLASH;
+                    Logger.d(TAG, "enableExternalFlashAeMode: "
+                            + "isAeModeExternalFlash = " + isAeModeExternalFlash);
+
+                    // Check if the lock values are as desired
+                    if (isAeModeExternalFlash == mIsExternalFlashAeModeEnabled) {
+                        // Ensure the session is actually updated
+                        if (Camera2CameraControlImpl.isSessionUpdated(result, sessionUpdateId)) {
+                            Logger.d(TAG, "enableExternalFlashAeMode: session updated with "
+                                    + "isAeModeExternalFlash = " + isAeModeExternalFlash);
+                            if (completer != null) {
+                                completer.set(null);
+                            }
+                            return true; // remove this listener
+                        }
+                    }
+
+                    return false; // continue checking
+                };
+
+        mCameraControl.addCaptureResultListener(mSessionListenerForAeMode);
+    }
+
     @ExecutedBy("mExecutor")
     private void disableAutoCancel() {
         if (mAutoCancelHandle != null) {
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2CapturePipelineTest.kt b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2CapturePipelineTest.kt
index 2c17f59..3d5f2e0 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2CapturePipelineTest.kt
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2CapturePipelineTest.kt
@@ -29,6 +29,7 @@
 import android.media.Image
 import android.media.ImageWriter
 import android.os.Build
+import android.os.Looper
 import android.view.Surface
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.impl.Camera2ImplConfig
@@ -41,6 +42,7 @@
 import androidx.camera.core.ImageCapture.FLASH_MODE_AUTO
 import androidx.camera.core.ImageCapture.FLASH_MODE_OFF
 import androidx.camera.core.ImageCapture.FLASH_MODE_ON
+import androidx.camera.core.ImageCapture.FLASH_MODE_SCREEN
 import androidx.camera.core.ImageCaptureException
 import androidx.camera.core.impl.CameraCaptureFailure
 import androidx.camera.core.impl.CameraCaptureMetaData.AeState
@@ -53,10 +55,12 @@
 import androidx.camera.core.impl.ImmediateSurface
 import androidx.camera.core.impl.Quirks
 import androidx.camera.core.impl.SessionConfig
+import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.core.internal.CameraCaptureResultImageInfo
 import androidx.camera.testing.impl.fakes.FakeCameraCaptureResult
 import androidx.camera.testing.impl.fakes.FakeImageProxy
+import androidx.camera.testing.impl.mocks.MockScreenFlashUiControl
 import androidx.concurrent.futures.await
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth
@@ -64,6 +68,7 @@
 import com.google.common.util.concurrent.ListenableFuture
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.ExecutionException
+import java.util.concurrent.Executor
 import java.util.concurrent.Executors
 import java.util.concurrent.ScheduledFuture
 import java.util.concurrent.TimeUnit
@@ -79,6 +84,7 @@
 import org.mockito.Mockito
 import org.mockito.Mockito.mock
 import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
 import org.robolectric.shadow.api.Shadow
@@ -134,9 +140,12 @@
             field = value
         }
 
+    private lateinit var screenFlashControl: MockScreenFlashUiControl
+
     @Before
     fun setUp() {
         initCameras()
+        screenFlashControl = MockScreenFlashUiControl()
     }
 
     @After
@@ -341,6 +350,100 @@
     }
 
     @Test
+    fun minLatency_screenFlashCapture_screenFlashTaskInvokedProperly() {
+        screenFlash_screenFlashUiControlInvokedProperly(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
+    }
+
+    @Test
+    fun maxQuality_screenFlashCapture_screenFlashTaskInvokedProperly() {
+        screenFlash_screenFlashUiControlInvokedProperly(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
+    }
+
+    private fun screenFlash_screenFlashUiControlInvokedProperly(imageCaptureMode: Int) {
+        val cameraControl = createCameraControl().apply {
+            // Arrange.
+            flashMode = FLASH_MODE_SCREEN
+
+            // Act.
+            submitStillCaptureRequests(
+                listOf(singleRequest),
+                imageCaptureMode,
+                ImageCapture.FLASH_TYPE_ONE_SHOT_FLASH,
+            )
+        }
+
+        // Wait for a few repeating requests to be submitted for the initial flash mode confirmation
+        // in Camera2CameraControlImpl#submitStillCaptureRequests
+        CountDownLatch(5).let {
+            cameraControl.simulateRepeatingResult(
+                initialDelay = 100,
+                period = 50,
+                requestCountLatch = it,
+                scheduledRunnableExecutor = CameraXExecutors.mainThreadExecutor()
+            )
+            it.await(1, TimeUnit.SECONDS)
+        }
+
+        // Wait for main thread because ScreenFlashTask invokes callbacks in UI thread
+        Shadows.shadowOf(Looper.getMainLooper()).idleFor(1, TimeUnit.SECONDS)
+
+        if (Build.VERSION.SDK_INT >= 28) {
+            // Submit a repeating request for CONTROL_AE_MODE_ON_EXTERNAL_FLASH
+            CountDownLatch(5).let {
+                cameraControl.simulateRepeatingResult(
+                    initialDelay = 100,
+                    period = 50,
+                    resultParameters = mapOf(CaptureResult.CONTROL_AE_MODE
+                        to CaptureResult.CONTROL_AE_MODE_ON_EXTERNAL_FLASH),
+                    requestCountLatch = it
+                )
+                it.await(1, TimeUnit.SECONDS)
+            }
+        }
+
+        // Assert, verify AE precapture is triggered
+        immediateCompleteCapture.verifyRequestResult {
+            it.requestContains(
+                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START
+            )
+        }
+
+        // Submit a repeating request for convergence
+        CountDownLatch(5).let {
+            cameraControl.simulateRepeatingResult(
+                initialDelay = 100,
+                period = 50,
+                resultParameters = resultConverged,
+                requestCountLatch = it
+            )
+            it.await(1, TimeUnit.SECONDS)
+        }
+
+        // Wait for main thread because ScreenFlashTask invokes callbacks in UI thread
+        Shadows.shadowOf(Looper.getMainLooper()).idleFor(1, TimeUnit.SECONDS)
+
+        // Assert, verify ScreenFlashUiControls are invoked properly
+        assertThat(screenFlashControl.awaitScreenFlashUiClear(1000)).isTrue()
+        assertThat(screenFlashControl.screenFlashUiEvents).isEqualTo(
+            listOf(
+                MockScreenFlashUiControl.APPLY_SCREEN_FLASH,
+                MockScreenFlashUiControl.CLEAR_SCREEN_FLASH
+            )
+        )
+
+        // Assert, AE precapture is cancelled finally.
+        if (Build.VERSION.SDK_INT >= 23) {
+            immediateCompleteCapture.verifyRequestResult {
+                it.requestContains(
+                    CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                    CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
+                )
+            }
+        }
+    }
+
+    @Test
     fun miniLatency_withTorchAsFlashQuirk_shouldOpenTorch() {
         withTorchAsFlashQuirk_shouldOpenTorch(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
     }
@@ -1026,14 +1129,19 @@
         initialDelay: Long = 100,
         period: Long = 100, // in milliseconds
         resultParameters: Map<CaptureResult.Key<*>, Any> = mutableMapOf(),
+        requestCountLatch: CountDownLatch? = null,
+        scheduledRunnableExecutor: Executor = executorService
     ) {
         runningRepeatingStream = executorService.scheduleAtFixedRate({
-            val tagBundle = sessionConfig.repeatingCaptureConfig.tagBundle
-            val requestOptions = sessionConfig.repeatingCaptureConfig.implementationOptions
-            val resultOptions = baseRepeatingResult.toMutableMap().apply {
-                putAll(resultParameters)
+            scheduledRunnableExecutor.execute {
+                val tagBundle = sessionConfig.repeatingCaptureConfig.tagBundle
+                val requestOptions = sessionConfig.repeatingCaptureConfig.implementationOptions
+                val resultOptions = baseRepeatingResult.toMutableMap().apply {
+                    putAll(resultParameters)
+                }
+                sendRepeatingResult(tagBundle, requestOptions.toParameters(), resultOptions)
+                requestCountLatch?.countDown()
             }
-            sendRepeatingResult(tagBundle, requestOptions.toParameters(), resultOptions)
         }, initialDelay, period, TimeUnit.MILLISECONDS)
     }
 
@@ -1085,6 +1193,7 @@
         ).apply {
             setActive(true)
             incrementUseCount()
+            this.screenFlashUiControl = screenFlashControl
         }
     }
 
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/FocusMeteringControlTest.kt b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/FocusMeteringControlTest.kt
index a5a3f91..e34c0cf3 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/FocusMeteringControlTest.kt
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/FocusMeteringControlTest.kt
@@ -191,6 +191,7 @@
                     CaptureResult.CONTROL_AE_MODE_ON,
                     CaptureResult.CONTROL_AE_MODE_ON_ALWAYS_FLASH,
                     CaptureResult.CONTROL_AE_MODE_ON_AUTO_FLASH,
+                    CaptureResult.CONTROL_AE_MODE_ON_EXTERNAL_FLASH,
                     CaptureResult.CONTROL_AE_MODE_OFF
                 )
             )
@@ -225,6 +226,14 @@
                 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL,
                 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3
             )
+            set(
+                CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES, intArrayOf(
+                    CaptureResult.CONTROL_AE_MODE_ON,
+                    CaptureResult.CONTROL_AE_MODE_ON_ALWAYS_FLASH,
+                    CaptureResult.CONTROL_AE_MODE_ON_AUTO_FLASH,
+                    CaptureResult.CONTROL_AE_MODE_OFF
+                )
+            )
             set(CameraCharacteristics.CONTROL_MAX_REGIONS_AF, 1)
             set(CameraCharacteristics.CONTROL_MAX_REGIONS_AE, 1)
             set(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB, 1)
@@ -1417,4 +1426,34 @@
             .addPoint(invalidPoint4).build()
         assertThat(focusMeteringControl.isFocusMeteringSupported(action)).isFalse()
     }
+
+    @Test
+    @Config(minSdk = 28)
+    fun canEnableExternalFlashAeMode() {
+        focusMeteringControl.enableExternalFlashAeMode(true)
+        assertThat(focusMeteringControl.isExternalFlashAeModeEnabled).isTrue()
+    }
+
+    @Test
+    @Config(minSdk = 28)
+    fun canDisableExternalFlashAeMode_afterEnable() {
+        focusMeteringControl.enableExternalFlashAeMode(true)
+        focusMeteringControl.enableExternalFlashAeMode(false)
+        assertThat(focusMeteringControl.isExternalFlashAeModeEnabled).isFalse()
+    }
+
+    @Test
+    @Config(maxSdk = 27)
+    fun canNotEnableExternalFlashAeMode_whenBelowApi28() {
+        focusMeteringControl.enableExternalFlashAeMode(true)
+        assertThat(focusMeteringControl.isExternalFlashAeModeEnabled).isFalse()
+    }
+
+    @Test
+    @Config(minSdk = 28)
+    fun canNotEnableExternalFlashAeMode_whenAeModeNotAvailable() {
+        focusMeteringControl = initFocusMeteringControl(CAMERA1_ID)
+        focusMeteringControl.enableExternalFlashAeMode(true)
+        assertThat(focusMeteringControl.isExternalFlashAeModeEnabled).isFalse()
+    }
 }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.kt b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.kt
index 2db0d98..a163c26 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.kt
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.kt
@@ -1936,7 +1936,8 @@
     @Test
     fun dynamicRangeResolver_resolvesToSdr8Bit_whenSdrWithUnspecifiedBitDepthProvided() {
         // Preview unspecified dynamic range
-        val useCase = createUseCase(CaptureType.PREVIEW,
+        val useCase = createUseCase(
+            CaptureType.PREVIEW,
             dynamicRange = DynamicRange(ENCODING_SDR, BIT_DEPTH_UNSPECIFIED)
         )
 
diff --git a/camera/camera-core/api/api_lint.ignore b/camera/camera-core/api/api_lint.ignore
index d0f65e0..9f80bac 100644
--- a/camera/camera-core/api/api_lint.ignore
+++ b/camera/camera-core/api/api_lint.ignore
@@ -35,28 +35,16 @@
     androidx.camera.core.FocusMeteringAction does not declare a `getPoints()` method matching method androidx.camera.core.FocusMeteringAction.Builder.addPoint(androidx.camera.core.MeteringPoint,int)
 MissingGetterMatchingBuilder: androidx.camera.core.FocusMeteringAction.Builder#setAutoCancelDuration(long, java.util.concurrent.TimeUnit):
     androidx.camera.core.FocusMeteringAction does not declare a `getAutoCancelDuration()` method matching method androidx.camera.core.FocusMeteringAction.Builder.setAutoCancelDuration(long,java.util.concurrent.TimeUnit)
-MissingGetterMatchingBuilder: androidx.camera.core.ImageAnalysis.Builder#setTargetAspectRatio(int):
-    androidx.camera.core.ImageAnalysis does not declare a `getTargetAspectRatio()` method matching method androidx.camera.core.ImageAnalysis.Builder.setTargetAspectRatio(int)
 MissingGetterMatchingBuilder: androidx.camera.core.ImageAnalysis.Builder#setTargetName(String):
     androidx.camera.core.ImageAnalysis does not declare a `getTargetName()` method matching method androidx.camera.core.ImageAnalysis.Builder.setTargetName(String)
-MissingGetterMatchingBuilder: androidx.camera.core.ImageAnalysis.Builder#setTargetResolution(android.util.Size):
-    androidx.camera.core.ImageAnalysis does not declare a `getTargetResolution()` method matching method androidx.camera.core.ImageAnalysis.Builder.setTargetResolution(android.util.Size)
 MissingGetterMatchingBuilder: androidx.camera.core.ImageCapture.Builder#setIoExecutor(java.util.concurrent.Executor):
     androidx.camera.core.ImageCapture does not declare a `getIoExecutor()` method matching method androidx.camera.core.ImageCapture.Builder.setIoExecutor(java.util.concurrent.Executor)
-MissingGetterMatchingBuilder: androidx.camera.core.ImageCapture.Builder#setTargetAspectRatio(int):
-    androidx.camera.core.ImageCapture does not declare a `getTargetAspectRatio()` method matching method androidx.camera.core.ImageCapture.Builder.setTargetAspectRatio(int)
 MissingGetterMatchingBuilder: androidx.camera.core.ImageCapture.Builder#setTargetName(String):
     androidx.camera.core.ImageCapture does not declare a `getTargetName()` method matching method androidx.camera.core.ImageCapture.Builder.setTargetName(String)
-MissingGetterMatchingBuilder: androidx.camera.core.ImageCapture.Builder#setTargetResolution(android.util.Size):
-    androidx.camera.core.ImageCapture does not declare a `getTargetResolution()` method matching method androidx.camera.core.ImageCapture.Builder.setTargetResolution(android.util.Size)
 MissingGetterMatchingBuilder: androidx.camera.core.ImageCapture.OutputFileOptions.Builder#setMetadata(androidx.camera.core.ImageCapture.Metadata):
     androidx.camera.core.ImageCapture.OutputFileOptions does not declare a `getMetadata()` method matching method androidx.camera.core.ImageCapture.OutputFileOptions.Builder.setMetadata(androidx.camera.core.ImageCapture.Metadata)
-MissingGetterMatchingBuilder: androidx.camera.core.Preview.Builder#setTargetAspectRatio(int):
-    androidx.camera.core.Preview does not declare a `getTargetAspectRatio()` method matching method androidx.camera.core.Preview.Builder.setTargetAspectRatio(int)
 MissingGetterMatchingBuilder: androidx.camera.core.Preview.Builder#setTargetName(String):
     androidx.camera.core.Preview does not declare a `getTargetName()` method matching method androidx.camera.core.Preview.Builder.setTargetName(String)
-MissingGetterMatchingBuilder: androidx.camera.core.Preview.Builder#setTargetResolution(android.util.Size):
-    androidx.camera.core.Preview does not declare a `getTargetResolution()` method matching method androidx.camera.core.Preview.Builder.setTargetResolution(android.util.Size)
 
 
 StaticFinalBuilder: androidx.camera.core.ExtendableBuilder:
diff --git a/camera/camera-core/api/current.txt b/camera/camera-core/api/current.txt
index 85f1ccd..63cbc35 100644
--- a/camera/camera-core/api/current.txt
+++ b/camera/camera-core/api/current.txt
@@ -290,9 +290,11 @@
     method @IntRange(from=1, to=100) public int getJpegQuality();
     method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
     method public androidx.camera.core.resolutionselector.ResolutionSelector? getResolutionSelector();
+    method public androidx.camera.core.ImageCapture.ScreenFlashUiControl? getScreenFlashUiControl();
     method public int getTargetRotation();
     method public void setCropAspectRatio(android.util.Rational);
     method public void setFlashMode(int);
+    method public void setScreenFlashUiControl(androidx.camera.core.ImageCapture.ScreenFlashUiControl?);
     method public void setTargetRotation(int);
     method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
     method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
@@ -307,6 +309,8 @@
     field public static final int FLASH_MODE_AUTO = 0; // 0x0
     field public static final int FLASH_MODE_OFF = 2; // 0x2
     field public static final int FLASH_MODE_ON = 1; // 0x1
+    field public static final int FLASH_MODE_SCREEN = 3; // 0x3
+    field public static final long SCREEN_FLASH_UI_APPLY_TIMEOUT_SECONDS = 3L; // 0x3L
   }
 
   public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
@@ -317,6 +321,7 @@
     method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
     method public androidx.camera.core.ImageCapture.Builder setJpegQuality(@IntRange(from=1, to=100) int);
     method public androidx.camera.core.ImageCapture.Builder setResolutionSelector(androidx.camera.core.resolutionselector.ResolutionSelector);
+    method public androidx.camera.core.ImageCapture.Builder setScreenFlashUiControl(androidx.camera.core.ImageCapture.ScreenFlashUiControl);
     method @Deprecated public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
     method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
     method @Deprecated public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
@@ -359,6 +364,15 @@
     method public android.net.Uri? getSavedUri();
   }
 
+  public static interface ImageCapture.ScreenFlashUiCompleter {
+    method public void complete();
+  }
+
+  public static interface ImageCapture.ScreenFlashUiControl {
+    method @UiThread public void applyScreenFlashUi(androidx.camera.core.ImageCapture.ScreenFlashUiCompleter);
+    method @UiThread public void clearScreenFlashUi();
+  }
+
   @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
     ctor public ImageCaptureException(int, String, Throwable?);
     method public int getImageCaptureError();
diff --git a/camera/camera-core/api/restricted_current.txt b/camera/camera-core/api/restricted_current.txt
index 85f1ccd..63cbc35 100644
--- a/camera/camera-core/api/restricted_current.txt
+++ b/camera/camera-core/api/restricted_current.txt
@@ -290,9 +290,11 @@
     method @IntRange(from=1, to=100) public int getJpegQuality();
     method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
     method public androidx.camera.core.resolutionselector.ResolutionSelector? getResolutionSelector();
+    method public androidx.camera.core.ImageCapture.ScreenFlashUiControl? getScreenFlashUiControl();
     method public int getTargetRotation();
     method public void setCropAspectRatio(android.util.Rational);
     method public void setFlashMode(int);
+    method public void setScreenFlashUiControl(androidx.camera.core.ImageCapture.ScreenFlashUiControl?);
     method public void setTargetRotation(int);
     method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
     method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
@@ -307,6 +309,8 @@
     field public static final int FLASH_MODE_AUTO = 0; // 0x0
     field public static final int FLASH_MODE_OFF = 2; // 0x2
     field public static final int FLASH_MODE_ON = 1; // 0x1
+    field public static final int FLASH_MODE_SCREEN = 3; // 0x3
+    field public static final long SCREEN_FLASH_UI_APPLY_TIMEOUT_SECONDS = 3L; // 0x3L
   }
 
   public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
@@ -317,6 +321,7 @@
     method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
     method public androidx.camera.core.ImageCapture.Builder setJpegQuality(@IntRange(from=1, to=100) int);
     method public androidx.camera.core.ImageCapture.Builder setResolutionSelector(androidx.camera.core.resolutionselector.ResolutionSelector);
+    method public androidx.camera.core.ImageCapture.Builder setScreenFlashUiControl(androidx.camera.core.ImageCapture.ScreenFlashUiControl);
     method @Deprecated public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
     method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
     method @Deprecated public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
@@ -359,6 +364,15 @@
     method public android.net.Uri? getSavedUri();
   }
 
+  public static interface ImageCapture.ScreenFlashUiCompleter {
+    method public void complete();
+  }
+
+  public static interface ImageCapture.ScreenFlashUiControl {
+    method @UiThread public void applyScreenFlashUi(androidx.camera.core.ImageCapture.ScreenFlashUiCompleter);
+    method @UiThread public void clearScreenFlashUi();
+  }
+
   @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
     ctor public ImageCaptureException(int, String, Throwable?);
     method public int getImageCaptureError();
diff --git a/camera/camera-core/lint-baseline.xml b/camera/camera-core/lint-baseline.xml
index 70dac88..c5c75a3 100644
--- a/camera/camera-core/lint-baseline.xml
+++ b/camera/camera-core/lint-baseline.xml
@@ -1,23 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="ExifInterface.TAG_THUMBNAIL_ORIENTATION can only be accessed from within the same library (androidx.exifinterface:exifinterface)"
-        errorLine1="            ExifInterface.TAG_THUMBNAIL_ORIENTATION);"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/core/impl/utils/Exif.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="ExifInterface.TAG_THUMBNAIL_ORIENTATION can only be accessed from within the same library (androidx.exifinterface:exifinterface)"
-        errorLine1="                ExifInterface.TAG_THUMBNAIL_ORIENTATION,"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/core/impl/utils/Exif.java"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="UnsafeOptInUsageError"
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index 6003b20..ebaa0a1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -28,6 +28,7 @@
 import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_IO_EXECUTOR;
 import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_JPEG_COMPRESSION_QUALITY;
 import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_MAX_RESOLUTION;
+import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_SCREEN_FLASH_UI_CONTROL;
 import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_SESSION_CONFIG_UNPACKER;
 import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_SUPPORTED_RESOLUTIONS;
 import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_SURFACE_OCCUPANCY_PRIORITY;
@@ -52,7 +53,6 @@
 import static androidx.camera.core.internal.utils.ImageUtil.isAspectRatioValid;
 import static androidx.core.util.Preconditions.checkNotNull;
 import static androidx.core.util.Preconditions.checkState;
-
 import static java.util.Objects.requireNonNull;
 
 import android.content.ContentResolver;
@@ -236,6 +236,42 @@
     public static final int FLASH_MODE_ON = 1;
     /** No flash. The flash will never be used when taking a picture. */
     public static final int FLASH_MODE_OFF = 2;
+    /**
+     * Screen flash. Display screen brightness will be used as alternative to flash when taking
+     * a picture with front camera.
+     *
+     * <p> This flash mode can be set via {@link #setFlashMode(int)} after setting a non-null
+     * {@link ScreenFlashUiControl} with {@link #setScreenFlashUiControl(ScreenFlashUiControl)}.
+     * This mode will always invoke all the necessary operations for a screen flash image capture,
+     * i.e. it is similar to {@link #FLASH_MODE_ON}, not {@link #FLASH_MODE_AUTO}.
+     *
+     * <p> The following code snippet shows an example implementation of how this flash mode can be
+     * set to an {@link ImageCapture} instance.
+     * <pre>{@code
+     * imageCapture.setScreenFlashUiControl(new ImageCapture.ScreenFlashUiControl() {
+     *     @Override
+     *     public void applyScreenFlashUi(@NonNUll ScreenFlashUiCompleter screenFlashUiCompleter) {
+     *         whiteColorOverlayView.setVisibility(View.VISIBLE);
+     *         maximizeScreenBrightness();
+     *         screenFlashUiCompleter.complete();
+     *     }
+     *
+     *     @Override
+     *     public void clearScreenFlashUi() {
+     *         restoreScreenBrightness();
+     *         whiteColorOverlayView.setVisibility(View.INVISIBLE);
+     *     }
+     * });
+     *
+     * imageCapture.setFlashMode(ImageCapture.FLASH_MODE_SCREEN);
+     * }</pre>
+     *
+     * @see #setFlashMode(int)
+     */
+    public static final int FLASH_MODE_SCREEN = 3;
+
+    /** The timeout in seconds for {@link ScreenFlashUiCompleter} to be completed. */
+    public static final long SCREEN_FLASH_UI_APPLY_TIMEOUT_SECONDS = 3;
 
     /**
      * When flash is required for taking a picture, a normal one shot flash will be used.
@@ -295,6 +331,7 @@
     @FlashMode
     private int mFlashMode = FLASH_MODE_UNKNOWN;
     private Rational mCropAspectRatio = null;
+    private ScreenFlashUiControl mScreenFlashUiControl;
 
     ////////////////////////////////////////////////////////////////////////////////////////////
     // [UseCase attached dynamic] - Can change but is only available when the UseCase is attached.
@@ -326,6 +363,7 @@
         }
 
         mFlashType = useCaseConfig.getFlashType(FLASH_TYPE_ONE_SHOT_FLASH);
+        mScreenFlashUiControl = useCaseConfig.getScreenFlashUiControl();
     }
 
     private boolean isSessionProcessorEnabledInCurrentCamera() {
@@ -446,6 +484,15 @@
     @Override
     public void onCameraControlReady() {
         trySetFlashModeToCameraControl();
+        setScreenFlashUiControlToCameraControl();
+    }
+
+    private @CameraSelector.LensFacing int getCameraLens() {
+        Camera camera = getCamera();
+        if (camera != null) {
+            return camera.getCameraInfo().getLensFacing();
+        }
+        return CameraSelector.LENS_FACING_UNKNOWN;
     }
 
     /**
@@ -467,8 +514,9 @@
      *
      * <p>The flash control for the subsequent photo capture requests. Applications can check if
      * there is a flash unit via {@link CameraInfo#hasFlashUnit()} and update UI component if
-     * necessary. If there is no flash unit, then calling this API will take no effect for the
-     * subsequent photo capture requests and they will act like {@link #FLASH_MODE_OFF}.
+     * necessary. If there is no flash unit and {@code flashMode} is not {@link #FLASH_MODE_SCREEN},
+     * then calling this API will take no effect for the subsequent photo capture requests and
+     * they will act like {@link #FLASH_MODE_OFF}.
      *
      * <p>When the torch is enabled via {@link CameraControl#enableTorch(boolean)}, the torch
      * will remain enabled during photo capture regardless of flashMode setting. When
@@ -478,13 +526,35 @@
      * mode could cause a crash. To workaround this CameraX will disable the auto flash behavior
      * internally on devices that have this issue.
      *
+     * <p>If {@link #FLASH_MODE_SCREEN} is set, a {@link ScreenFlashUiControl} implementation
+     * must be set via {@link #setScreenFlashUiControl(ScreenFlashUiControl)} before calling this
+     * API. Trying to use {@link #FLASH_MODE_SCREEN} without a ScreenFlashUiControl set or with a
+     * non-front camera will result in an {@link IllegalArgumentException}. It is the application's
+     * responsibility to change flashMode while switching the camera in case it leads to a
+     * non-supported case (e.g. switching to rear camera while FLASH_MODE_SCREEN is still on).
+     *
      * @param flashMode the flash mode. Value is {@link #FLASH_MODE_AUTO}, {@link #FLASH_MODE_ON},
-     *                  or {@link #FLASH_MODE_OFF}.
+     *                  {@link #FLASH_MODE_SCREEN} or {@link #FLASH_MODE_OFF}.
+     *
+     * @throws IllegalArgumentException If flash mode is invalid or FLASH_MODE_SCREEN is used
+     *                                  without a ScreenFlashUiControl or front camera.
      */
     public void setFlashMode(@FlashMode int flashMode) {
         if (flashMode != FLASH_MODE_AUTO && flashMode != FLASH_MODE_ON
                 && flashMode != FLASH_MODE_OFF) {
-            throw new IllegalArgumentException("Invalid flash mode: " + flashMode);
+            if (flashMode == FLASH_MODE_SCREEN) {
+                if (mScreenFlashUiControl == null) {
+                    throw new IllegalArgumentException(
+                            "ScreenFlashUiControl not set for FLASH_MODE_SCREEN");
+                }
+
+                if (getCamera() != null && getCameraLens() != CameraSelector.LENS_FACING_FRONT) {
+                    throw new IllegalArgumentException(
+                            "Not a front camera despite setting FLASH_MODE_SCREEN");
+                }
+            } else {
+                throw new IllegalArgumentException("Invalid flash mode: " + flashMode);
+            }
         }
 
         synchronized (mLockedFlashMode) {
@@ -494,6 +564,39 @@
     }
 
     /**
+     * Sets {@link ScreenFlashUiControl} for subsequent photo capture requests.
+     *
+     * <p>The calling of this API will take effect for {@link #FLASH_MODE_SCREEN} only
+     * and the {@code screenFlashUiControl} will be ignored for other flash modes.
+     *
+     * <p>If the implementation provided by the user is no longer valid (e.g. due to any
+     * {@link android.app.Activity} or {@link android.view.View} reference used in the
+     * implementation becoming invalid), user needs to re-set a new valid ScreenFlashUiControl or
+     * clear the previous one with {@code setScreenFlashUiControl(null)}, whichever appropriate.
+     *
+     * @param screenFlashUiControl A {@link ScreenFlashUiControl} implementation that is used to
+     *                             notify API users when app side changes need to be done. This
+     *                             will replace the previous {@code ScreenFlashUiControl} set
+     *                             with this method.
+     */
+    public void setScreenFlashUiControl(@Nullable ScreenFlashUiControl screenFlashUiControl) {
+        mScreenFlashUiControl = screenFlashUiControl;
+        setScreenFlashUiControlToCameraControl();
+    }
+
+    /**
+     * Returns the {@link ScreenFlashUiControl} currently set, null if none.
+     */
+    @Nullable
+    public ScreenFlashUiControl getScreenFlashUiControl() {
+        return mScreenFlashUiControl;
+    }
+
+    private void setScreenFlashUiControlToCameraControl() {
+        getCameraControl().setScreenFlashUiControl(mScreenFlashUiControl);
+    }
+
+    /**
      * Sets target cropping aspect ratio for output image.
      *
      * <p>This aspect ratio is orientation-dependent. It should be expressed in the coordinate
@@ -708,6 +811,9 @@
      *
      * @param executor The executor in which the callback methods will be run.
      * @param callback Callback to be invoked for the newly captured image
+     *
+     * @throws IllegalArgumentException If {@link ImageCapture#FLASH_MODE_SCREEN} is used without a
+     *                                  ScreenFlashUiControl.
      */
     public void takePicture(@NonNull Executor executor,
             final @NonNull OnImageCapturedCallback callback) {
@@ -732,6 +838,9 @@
      * @param outputFileOptions  Options to store the newly captured image.
      * @param executor           The executor in which the callback methods will be run.
      * @param imageSavedCallback Callback to be called for the newly captured image.
+     *
+     * @throws IllegalArgumentException If {@link ImageCapture#FLASH_MODE_SCREEN} is used without a
+     *                                  ScreenFlashUiControl.
      * @see ViewPort
      */
     public void takePicture(
@@ -915,6 +1024,12 @@
     public void onBind() {
         CameraInternal camera = getCamera();
         checkNotNull(camera, "Attached camera cannot be null");
+
+        if (getFlashMode() == FLASH_MODE_SCREEN
+                && getCameraLens() != CameraSelector.LENS_FACING_FRONT) {
+            throw new IllegalArgumentException(
+                    "Not a front camera despite setting FLASH_MODE_SCREEN in ImageCapture");
+        }
     }
 
     /**
@@ -1028,6 +1143,9 @@
 
     /**
      * Takes a picture with the new architecture.
+     *
+     * @throws IllegalArgumentException If {@link ImageCapture#FLASH_MODE_SCREEN} is used without a
+     *                                  ScreenFlashUiControl.
      */
     @MainThread
     private void takePictureInternal(@NonNull Executor executor,
@@ -1035,6 +1153,10 @@
             @Nullable ImageCapture.OnImageSavedCallback onDiskCallback,
             @Nullable OutputFileOptions outputFileOptions) {
         checkMainThread();
+        if (getFlashMode() == ImageCapture.FLASH_MODE_SCREEN && mScreenFlashUiControl == null) {
+            throw new IllegalArgumentException(
+                    "ScreenFlashUiControl not set for FLASH_MODE_SCREEN");
+        }
         Log.d(TAG, "takePictureInternal");
         CameraInternal camera = getCamera();
         if (camera == null) {
@@ -1227,7 +1349,7 @@
      * the torch is disabled, flash will function as specified by
      * {@link #setFlashMode(int)}.
      */
-    @IntDef({FLASH_MODE_UNKNOWN, FLASH_MODE_AUTO, FLASH_MODE_ON, FLASH_MODE_OFF})
+    @IntDef({FLASH_MODE_UNKNOWN, FLASH_MODE_AUTO, FLASH_MODE_ON, FLASH_MODE_SCREEN, FLASH_MODE_OFF})
     @Retention(RetentionPolicy.SOURCE)
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public @interface FlashMode {
@@ -1304,6 +1426,68 @@
     }
 
     /**
+     * Interface to inform if application UI change has been completed for a screen flash image
+     * capture.
+     */
+    public interface ScreenFlashUiCompleter {
+        /**
+         * Completes this {@link ScreenFlashUiCompleter} instance so that CameraX is no
+         * longer waiting.
+         *
+         * @see ScreenFlashUiControl#applyScreenFlashUi
+         */
+        void complete();
+    }
+
+    /** Interface to do the application UI changes for screen flash operations. */
+    public interface ScreenFlashUiControl {
+        /**
+         * Applies the necessary application UI changes for a screen flash photo capture.
+         *
+         * <p>CameraX will invoke this method when the application UI needs to be changed for a
+         * successful photo capture with screen flash feature. When this callback is invoked, the
+         * application UI should utilize the screen to provide extra light as an alternative to
+         * physical flash. For example, the screen brightness can be maximized and screen color
+         * can be covered with some bright color like white.
+         *
+         * <p>With a timeout of {@link #SCREEN_FLASH_UI_APPLY_TIMEOUT_SECONDS} seconds, CameraX
+         * will wait for the provided {@link ScreenFlashUiCompleter} argument to be completed
+         * before starting any operation that is dependent on the UI change. Applications must call
+         * {@link ScreenFlashUiCompleter#complete()} after their UI changes are done so that
+         * CameraX is not unnecessarily waiting. If the application does not call {@code
+         * ScreenFlashUiCompleter#complete} within the timeout, CameraX will stop waiting and
+         * move forward with the subsequent operations regardless. In such case, it is the
+         * application's responsibility to clear any UI change done after
+         * {@link #clearScreenFlashUi} has been invoked.
+         *
+         * <p>The following code snippet shows an example implementation of this API.
+         * <pre>{@code
+         * @Override
+         * public void applyScreenFlashUi(@NonNull ScreenFlashUiCompleter screenFlashUiCompleter) {
+         *     // Enable top overlay to make screen color white
+         *     whiteColorOverlay.setVisible(true);
+         *     // Maximize screen brightness
+         *     maximizeScreenBrightness();
+         *     screenFlashUiCompleter.complete();
+         * }}</pre>
+         *
+         * @param screenFlashUiCompleter Used to notify when UI changes have been applied.
+         */
+        @UiThread
+        void applyScreenFlashUi(@NonNull ScreenFlashUiCompleter screenFlashUiCompleter);
+
+        /**
+         * Clears any application UI change done for screen flash, if required.
+         *
+         * <p>CameraX will invoke this method when a screen flash photo capture has been completed
+         * and the application screen can be safely changed to a state not conforming to screen
+         * flash photo capture.
+         */
+        @UiThread
+        void clearScreenFlashUi();
+    }
+
+    /**
      * Provides a base static default configuration for the ImageCapture
      *
      * <p>These values may be overridden by the implementation. They only provide a minimum set of
@@ -1892,7 +2076,9 @@
          *
          * @return A {@link ImageCapture} populated with the current state.
          * @throws IllegalArgumentException if attempting to set both target aspect ratio and
-         *                                  target resolution.
+         *                                  target resolution, or attempting to set
+         *                                  {@link ImageCapture#FLASH_MODE_SCREEN} without
+         *                                  setting a non-null {@link ScreenFlashUiControl}.
          */
         @Override
         @NonNull
@@ -1928,10 +2114,19 @@
                 Integer flashMode = getMutableConfig().retrieveOption(OPTION_FLASH_MODE);
 
                 if (flashMode == null || (flashMode != FLASH_MODE_AUTO && flashMode != FLASH_MODE_ON
-                        && flashMode != FLASH_MODE_OFF)) {
+                        && flashMode != FLASH_MODE_SCREEN && flashMode != FLASH_MODE_OFF)) {
                     throw new IllegalArgumentException(
                             "The flash mode is not allowed to set: " + flashMode);
                 }
+
+                if (flashMode == FLASH_MODE_SCREEN) {
+                    if (getMutableConfig().retrieveOption(OPTION_SCREEN_FLASH_UI_CONTROL, null)
+                            == null) {
+                        throw new IllegalArgumentException(
+                                "The flash mode is not allowed to set to FLASH_MODE_SCREEN "
+                                        + "without setting ScreenFlashUiControl");
+                    }
+                }
             }
 
             return imageCapture;
@@ -1963,10 +2158,15 @@
          *
          * <p>If not set, the flash mode will default to {@link #FLASH_MODE_OFF}.
          *
+         * <p>If set to {@link #FLASH_MODE_SCREEN}, a non-null {@link ScreenFlashUiControl} must
+         * also be set with {@link #setScreenFlashUiControl(ScreenFlashUiControl)}. Otherwise, an
+         * {@link IllegalArgumentException} will be thrown when {@link #build()} is invoked.
+         *
          * <p>See {@link ImageCapture#setFlashMode(int)} for more information.
          *
          * @param flashMode The requested flash mode. Value is {@link #FLASH_MODE_AUTO},
-         *                  {@link #FLASH_MODE_ON}, or {@link #FLASH_MODE_OFF}.
+         *                  {@link #FLASH_MODE_ON}, {@link #FLASH_MODE_SCREEN}, or
+         *                  {@link #FLASH_MODE_OFF}.
          * @return The current Builder.
          */
         @NonNull
@@ -1976,6 +2176,26 @@
         }
 
         /**
+         * Sets the {@link ScreenFlashUiControl} necessary for screen flash operations.
+         *
+         * <p>If not set, the control will be set to null and users will need to set it later
+         * before calling {@link #setFlashMode(int)} with {@link #FLASH_MODE_SCREEN}.
+         *
+         * <p>See {@link ImageCapture#setScreenFlashUiControl(ScreenFlashUiControl)} for more
+         * information.
+         *
+         * @param screenFlashUiControl The {@link ScreenFlashUiControl} to notify caller for the
+         *                             UI side changes required for photo capture with
+         *                             {@link #FLASH_MODE_SCREEN}.
+         * @return The current Builder.
+         */
+        @NonNull
+        public Builder setScreenFlashUiControl(@NonNull ScreenFlashUiControl screenFlashUiControl) {
+            getMutableConfig().insertOption(OPTION_SCREEN_FLASH_UI_CONTROL, screenFlashUiControl);
+            return this;
+        }
+
+        /**
          * Sets the {@link ImageFormat} of the {@link ImageProxy} returned by the
          * {@link ImageCapture.OnImageCapturedCallback}.
          *
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
index c89bb2f..85864cb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
@@ -21,6 +21,7 @@
 import android.graphics.Rect;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.FocusMeteringAction;
@@ -29,6 +30,7 @@
 import androidx.camera.core.ImageCapture.CaptureMode;
 import androidx.camera.core.ImageCapture.FlashMode;
 import androidx.camera.core.ImageCapture.FlashType;
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl;
 import androidx.camera.core.impl.utils.futures.Futures;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -62,6 +64,14 @@
     void setFlashMode(@FlashMode int flashMode);
 
     /**
+     * Sets screen flash UI control.
+     *
+     * @param screenFlashUiControl An {@link ScreenFlashUiControl} used to notify API
+     *                             users when UI side changes need to be done.
+     */
+    default void setScreenFlashUiControl(@Nullable ScreenFlashUiControl screenFlashUiControl) {}
+
+    /**
      * Adds zero-shutter lag config to {@link SessionConfig}.
      * @param sessionConfigBuilder session config builder.
      */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ForwardingCameraControl.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ForwardingCameraControl.java
index ea73135..87d7a03 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ForwardingCameraControl.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ForwardingCameraControl.java
@@ -19,6 +19,7 @@
 import android.graphics.Rect;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.FocusMeteringResult;
@@ -93,6 +94,11 @@
     }
 
     @Override
+    public void setScreenFlashUiControl(@Nullable ImageCapture.ScreenFlashUiControl callback) {
+        mCameraControlInternal.setScreenFlashUiControl(callback);
+    }
+
+    @Override
     public void addZslConfig(@NonNull SessionConfig.Builder sessionConfigBuilder) {
         mCameraControlInternal.addZslConfig(sessionConfigBuilder);
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
index 0efd37c..1973d9d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
@@ -25,6 +25,7 @@
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.ImageCapture.CaptureMode;
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl;
 import androidx.camera.core.ImageReaderProxyProvider;
 import androidx.camera.core.internal.IoConfig;
 
@@ -60,6 +61,9 @@
             Option.create("camerax.core.imageCapture.flashType", int.class);
     public static final Option<Integer> OPTION_JPEG_COMPRESSION_QUALITY =
             Option.create("camerax.core.imageCapture.jpegCompressionQuality", int.class);
+    public static final Option<ScreenFlashUiControl> OPTION_SCREEN_FLASH_UI_CONTROL =
+            Option.create("camerax.core.imageCapture.screenFlashUiControl",
+                    ScreenFlashUiControl.class);
     // *********************************************************************************************
 
     private final OptionsBundle mConfig;
@@ -260,6 +264,14 @@
         return retrieveOption(OPTION_JPEG_COMPRESSION_QUALITY);
     }
 
+    /**
+     * Gets the caller provided {@link ScreenFlashUiControl}.
+     */
+    @Nullable
+    public ScreenFlashUiControl getScreenFlashUiControl() {
+        return retrieveOption(OPTION_SCREEN_FLASH_UI_CONTROL, null);
+    }
+
     // Implementations of IO default methods
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
index 4410d11..9f71fff 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
@@ -442,6 +442,36 @@
     }
 
     /**
+     * Returns a future that delegates to the supplied future but will finish early normally with
+     * the provided default value if the specified duration expires.
+     *
+     * @param timeoutMillis     When to time out the future in milliseconds.
+     * @param scheduledExecutor The executor service to enforce the timeout.
+     * @param defaultValue      The default value to complete input future with in case of timeout.
+     * @param input             The future to delegate to.
+     */
+    @NonNull
+    public static <V> ListenableFuture<V> makeTimeoutFuture(
+            long timeoutMillis,
+            @NonNull ScheduledExecutorService scheduledExecutor,
+            @Nullable V defaultValue,
+            @NonNull ListenableFuture<V> input) {
+        return CallbackToFutureAdapter.getFuture(completer -> {
+            propagate(input, completer);
+            if (!input.isDone()) {
+                ScheduledFuture<?> timeoutFuture = scheduledExecutor.schedule(
+                        () -> {
+                            completer.set(defaultValue);
+                        },
+                        timeoutMillis, TimeUnit.MILLISECONDS);
+                input.addListener(
+                        () -> timeoutFuture.cancel(true), CameraXExecutors.directExecutor());
+            }
+            return "TimeoutFuture[" + input + "]";
+        });
+    }
+
+    /**
      * Should not be instantiated.
      */
     private Futures() {}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
index f45ad2d..a839f9c 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
@@ -56,6 +56,7 @@
 import androidx.camera.testing.impl.CameraXUtil
 import androidx.camera.testing.impl.fakes.FakeCameraFactory
 import androidx.camera.testing.impl.fakes.FakeImageReaderProxy
+import androidx.camera.testing.impl.mocks.MockScreenFlashUiControl
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import java.io.File
@@ -91,6 +92,7 @@
     private lateinit var callbackThread: HandlerThread
     private lateinit var executor: Executor
     private lateinit var camera: FakeCamera
+    private lateinit var cameraFront: FakeCamera
     private var fakeImageReaderProxy: FakeImageReaderProxy? = null
     private var capturedImage: ImageProxy? = null
     private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
@@ -116,7 +118,9 @@
             isPrivateReprocessingSupported = true
         }
 
-        camera = FakeCamera(null, cameraInfo)
+        camera = FakeCamera("0", null, cameraInfo)
+        cameraFront =
+            FakeCamera("1", null, FakeCameraInfoInternal("1", CameraSelector.LENS_FACING_FRONT))
 
         val cameraFactoryProvider =
             CameraFactory.Provider { _, _, _, _ ->
@@ -124,6 +128,9 @@
                 cameraFactory.insertDefaultBackCamera(camera.cameraInfoInternal.cameraId) {
                     camera
                 }
+                cameraFactory.insertDefaultFrontCamera(cameraFront.cameraInfoInternal.cameraId) {
+                    cameraFront
+                }
                 cameraFactory
             }
         val cameraXConfig = CameraXConfig.Builder.fromConfig(
@@ -452,13 +459,75 @@
         }
     }
 
+    @Test
+    fun throwExceptionWhileBuilding_whenScreenFlashSetWithoutScreenFlashUiControl() {
+        assertThrows(IllegalArgumentException::class.java) {
+            ImageCapture.Builder().setFlashMode(ImageCapture.FLASH_MODE_SCREEN).build()
+        }
+    }
+
+    @Test
+    fun throwException_whenScreenFlashSetWithoutScreenFlashUiControl() {
+        val imageCapture = ImageCapture.Builder().build()
+
+        assertThrows(IllegalArgumentException::class.java) {
+            imageCapture.flashMode = ImageCapture.FLASH_MODE_SCREEN
+        }
+    }
+
+    @Test
+    fun throwException_whenTakePictureWithScreenFlashButNoUiControl() {
+        val imageCapture = ImageCapture.Builder().build()
+        imageCapture.screenFlashUiControl = MockScreenFlashUiControl()
+        imageCapture.flashMode = ImageCapture.FLASH_MODE_SCREEN
+        imageCapture.screenFlashUiControl = null
+
+        assertThrows(IllegalArgumentException::class.java) {
+            imageCapture.takePicture(executor, onImageCapturedCallback)
+        }
+    }
+
+    @Test
+    fun throwException_whenScreenFlashSetToBackCamera() {
+        val imageCapture = bindImageCapture(cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA)
+        imageCapture.screenFlashUiControl = MockScreenFlashUiControl()
+
+        assertThrows(IllegalArgumentException::class.java) {
+            imageCapture.flashMode = ImageCapture.FLASH_MODE_SCREEN
+        }
+    }
+
+    @Test
+    fun canSetScreenFlash_whenFrontCameraAndUiControlSet() {
+        val imageCapture = bindImageCapture(cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA)
+
+        imageCapture.screenFlashUiControl = MockScreenFlashUiControl()
+        imageCapture.flashMode = ImageCapture.FLASH_MODE_SCREEN
+    }
+
+    @Test
+    fun throwException_whenSwitchToBackCameraAfterScreenFlashSetToFrontCamera() {
+        val imageCapture = bindImageCapture(cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA)
+        imageCapture.screenFlashUiControl = MockScreenFlashUiControl()
+        imageCapture.flashMode = ImageCapture.FLASH_MODE_SCREEN
+
+        assertThrows(CameraUseCaseAdapter.CameraException::class.java) {
+            val cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(
+                ApplicationProvider.getApplicationContext(),
+                CameraSelector.DEFAULT_BACK_CAMERA
+            )
+            cameraUseCaseAdapter.addUseCases(Collections.singleton<UseCase>(imageCapture))
+        }
+    }
+
     private fun bindImageCapture(
         captureMode: Int = ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY,
         viewPort: ViewPort? = null,
         // Set non jpg format so it doesn't trigger the exif code path.
         bufferFormat: Int = ImageFormat.YUV_420_888,
         imageReaderProxyProvider: ImageReaderProxyProvider? = null,
-        sessionProcessor: SessionProcessor? = null
+        sessionProcessor: SessionProcessor? = null,
+        cameraSelector: CameraSelector = CameraSelector.DEFAULT_BACK_CAMERA,
     ): ImageCapture {
         // Arrange.
         val imageCapture = createImageCapture(
@@ -469,7 +538,7 @@
 
         cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(
             ApplicationProvider.getApplicationContext(),
-            CameraSelector.DEFAULT_BACK_CAMERA
+            cameraSelector
         )
 
         cameraUseCaseAdapter.setViewPort(viewPort)
diff --git a/camera/camera-effects/src/androidTest/java/androidx/camera/effects/opengl/GlRendererDeviceTest.kt b/camera/camera-effects/src/androidTest/java/androidx/camera/effects/opengl/GlRendererDeviceTest.kt
index 73a5942..df1d4a0 100644
--- a/camera/camera-effects/src/androidTest/java/androidx/camera/effects/opengl/GlRendererDeviceTest.kt
+++ b/camera/camera-effects/src/androidTest/java/androidx/camera/effects/opengl/GlRendererDeviceTest.kt
@@ -59,13 +59,14 @@
         private const val WIDTH = 640
         private const val HEIGHT = 480
         private const val TIMESTAMP_NS = 0L
+        private const val NO_QUEUE = 0
     }
 
     private val input = createBitmap(WIDTH, HEIGHT)
     private val overlay = createOverlayBitmap()
     private val transparentOverlay = createTransparentOverlay()
 
-    private val glRenderer = GlRenderer()
+    private lateinit var glRenderer: GlRenderer
     private lateinit var inputSurface: Surface
     private lateinit var inputTexture: SurfaceTexture
     private lateinit var inputExecutor: ExecutorService
@@ -80,34 +81,25 @@
     @Before
     fun setUp() = runBlocking {
         inputExecutor = Executors.newSingleThreadExecutor()
-        withContext(inputExecutor.asCoroutineDispatcher()) {
-            glRenderer.init()
-            inputTexture = SurfaceTexture(glRenderer.inputTextureId).apply {
-                setDefaultBufferSize(WIDTH, HEIGHT)
-            }
-            inputSurface = Surface(inputTexture)
-        }
-        outputTexture = SurfaceTexture(0).apply {
-            setDefaultBufferSize(WIDTH, HEIGHT)
-        }
-        outputSurface = Surface(outputTexture)
     }
 
     @After
     fun tearDown() {
-        inputExecutor.execute {
-            glRenderer.release()
-            inputTexture.release()
-            inputSurface.release()
+        if (::glRenderer.isInitialized) {
+            inputExecutor.execute {
+                glRenderer.release()
+                inputTexture.release()
+                inputSurface.release()
+            }
+            outputTexture.release()
+            outputSurface.release()
         }
-        outputTexture.release()
-        outputSurface.release()
         inputExecutor.shutdown()
     }
 
     @Test(expected = IllegalStateException::class)
     fun renderInputWhenUninitialized_throwsException() {
-        val glRenderer = GlRenderer()
+        val glRenderer = GlRenderer(NO_QUEUE)
         try {
             glRenderer.renderInputToSurface(TIMESTAMP_NS, identityMatrix, outputSurface)
         } finally {
@@ -118,9 +110,10 @@
     @Test
     fun drawInputToQueue_snapshot() = runBlocking(inputExecutor.asCoroutineDispatcher()) {
         // Arrange: upload a overlay and create a texture queue.
+        initGlRenderer(1)
         glRenderer.uploadOverlay(overlay)
         drawInputSurface(input)
-        val queue = glRenderer.createBufferTextureIds(1, Size(WIDTH, HEIGHT))
+        val queue = glRenderer.createBufferTextureIds(Size(WIDTH, HEIGHT))
         // Act: draw input to the queue and then to the output.
         glRenderer.renderInputToQueueTexture(queue[0])
         val bitmap =
@@ -132,6 +125,7 @@
     @Test
     fun drawInputWithoutOverlay_snapshot() = runBlocking(inputExecutor.asCoroutineDispatcher()) {
         // Arrange: upload a transparent overlay.
+        initGlRenderer(NO_QUEUE)
         glRenderer.uploadOverlay(transparentOverlay)
         drawInputSurface(input)
         // Act.
@@ -140,6 +134,39 @@
         assertThat(getAverageDiff(output, input)).isEqualTo(0)
     }
 
+    @Test(expected = IllegalStateException::class)
+    fun drawInputWithQueue_throwsException() = runBlocking(inputExecutor.asCoroutineDispatcher()) {
+        initGlRenderer(1)
+        glRenderer.renderInputToSurface(TIMESTAMP_NS, identityMatrix, outputSurface)
+    }
+
+    @Test(expected = IllegalStateException::class)
+    fun drawTextureWithoutQueue_throwsException() =
+        runBlocking(inputExecutor.asCoroutineDispatcher()) {
+            initGlRenderer(NO_QUEUE)
+            glRenderer.renderQueueTextureToSurface(
+                0,
+                TIMESTAMP_NS,
+                identityMatrix,
+                outputSurface
+            )
+        }
+
+    private suspend fun initGlRenderer(queueDepth: Int) {
+        glRenderer = GlRenderer(queueDepth)
+        withContext(inputExecutor.asCoroutineDispatcher()) {
+            glRenderer.init()
+            inputTexture = SurfaceTexture(glRenderer.inputTextureId).apply {
+                setDefaultBufferSize(WIDTH, HEIGHT)
+            }
+            inputSurface = Surface(inputTexture)
+        }
+        outputTexture = SurfaceTexture(0).apply {
+            setDefaultBufferSize(WIDTH, HEIGHT)
+        }
+        outputSurface = Surface(outputTexture)
+    }
+
     /**
      * Tests that the input is rendered to the output surface with the overlay.
      */
diff --git a/camera/camera-effects/src/main/java/androidx/camera/effects/internal/SurfaceProcessorImpl.java b/camera/camera-effects/src/main/java/androidx/camera/effects/internal/SurfaceProcessorImpl.java
index e46f4b5..92283a0 100644
--- a/camera/camera-effects/src/main/java/androidx/camera/effects/internal/SurfaceProcessorImpl.java
+++ b/camera/camera-effects/src/main/java/androidx/camera/effects/internal/SurfaceProcessorImpl.java
@@ -17,6 +17,7 @@
 
 import static androidx.core.util.Preconditions.checkArgument;
 import static androidx.core.util.Preconditions.checkState;
+
 import static java.util.Objects.requireNonNull;
 
 import android.graphics.Bitmap;
@@ -61,8 +62,7 @@
     private final Executor mGlExecutor;
 
     // GL renderer.
-    private final GlRenderer mGlRenderer = new GlRenderer();
-    private final int mQueueDepth;
+    private final GlRenderer mGlRenderer;
 
     // Transform matrices.
     private final float[] mSurfaceTransform = new float[16];
@@ -89,7 +89,7 @@
     public SurfaceProcessorImpl(int queueDepth, @NonNull Handler glHandler) {
         mGlHandler = glHandler;
         mGlExecutor = CameraXExecutors.newHandlerExecutor(mGlHandler);
-        mQueueDepth = queueDepth;
+        mGlRenderer = new GlRenderer(queueDepth);
         runOnGlThread(mGlRenderer::init);
     }
 
@@ -277,7 +277,7 @@
         mInputSize = inputSize;
 
         // Create a buffer of textures with the same size as the input.
-        int[] textureIds = mGlRenderer.createBufferTextureIds(mQueueDepth, mInputSize);
+        int[] textureIds = mGlRenderer.createBufferTextureIds(mInputSize);
         mBuffer = new TextureFrameBuffer(textureIds);
 
         // Create the overlay Bitmap with the same size as the input.
diff --git a/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlProgram.java b/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlProgram.java
index 242536f1..0e893aa 100644
--- a/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlProgram.java
+++ b/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlProgram.java
@@ -26,6 +26,7 @@
 import androidx.annotation.CallSuper;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.Logger;
 
 import java.nio.FloatBuffer;
@@ -200,4 +201,10 @@
         }
         return shader;
     }
+
+    @VisibleForTesting
+    @NonNull
+    String getFragmentShader() {
+        return mFragmentShader;
+    }
 }
diff --git a/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlProgramOverlay.java b/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlProgramOverlay.java
index 61a1a9f..dd5fdc1 100644
--- a/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlProgramOverlay.java
+++ b/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlProgramOverlay.java
@@ -58,24 +58,18 @@
             + TEXTURE_ATTRIBUTE + ").xy;\n"
             + "}";
 
-    private static final String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
-            + "precision mediump float;\n"
-            + "varying vec2 " + TEXTURE_COORDINATES + ";\n"
-            + "uniform samplerExternalOES " + INPUT_SAMPLER + ";\n"
-            + "uniform sampler2D " + OVERLAY_SAMPLER + ";\n"
-            + "void main() {\n"
-            + "    vec4 inputColor = texture2D(" + INPUT_SAMPLER + ", "
-            + TEXTURE_COORDINATES + ");\n"
-            + "    vec4 overlayColor = texture2D(" + OVERLAY_SAMPLER + ", "
-            + TEXTURE_COORDINATES + ");\n"
-            + "    gl_FragColor = inputColor * (1.0 - overlayColor.a) + overlayColor;\n"
-            + "}";
+    private static final String SAMPLER_EXTERNAL = "samplerExternalOES";
+    private static final String SAMPLER_2D = "sampler2D";
 
     // Location of the texture matrix used in vertex shader.
     private int mTextureMatrixLoc = -1;
 
-    GlProgramOverlay() {
-        super(VERTEX_SHADER, FRAGMENT_SHADER);
+    GlProgramOverlay(int queueDepth) {
+        super(
+                VERTEX_SHADER,
+                // When the queue exists, the overlay program's input is the buffered 2D textures.
+                createFragmentShader(queueDepth > 0 ? SAMPLER_2D : SAMPLER_EXTERNAL)
+        );
     }
 
     @Override
@@ -157,6 +151,22 @@
         return bitmap;
     }
 
+    @NonNull
+    private static String createFragmentShader(@NonNull String inputSampler) {
+        return "#extension GL_OES_EGL_image_external : require\n"
+                + "precision mediump float;\n"
+                + "varying vec2 " + TEXTURE_COORDINATES + ";\n"
+                + "uniform " + inputSampler + " " + INPUT_SAMPLER + ";\n"
+                + "uniform sampler2D " + OVERLAY_SAMPLER + ";\n"
+                + "void main() {\n"
+                + "    vec4 inputColor = texture2D(" + INPUT_SAMPLER + ", "
+                + TEXTURE_COORDINATES + ");\n"
+                + "    vec4 overlayColor = texture2D(" + OVERLAY_SAMPLER + ", "
+                + TEXTURE_COORDINATES + ");\n"
+                + "    gl_FragColor = inputColor * (1.0 - overlayColor.a) + overlayColor;\n"
+                + "}";
+    }
+
     /**
      * Draws the input texture and overlay to a FBO and download the bytes to the given ByteBuffer.
      */
diff --git a/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlRenderer.java b/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlRenderer.java
index 8046e43f..1e8e8ac 100644
--- a/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlRenderer.java
+++ b/camera/camera-effects/src/main/java/androidx/camera/effects/opengl/GlRenderer.java
@@ -56,7 +56,8 @@
 
     private Thread mGlThread = null;
     private final GlContext mGlContext = new GlContext();
-    private final GlProgramOverlay mGlProgramOverlay = new GlProgramOverlay();
+    private final int mQueueDepth;
+    private final GlProgramOverlay mGlProgramOverlay;
     private final GlProgramCopy mGlProgramCopy = new GlProgramCopy();
 
     // Texture IDs.
@@ -69,6 +70,11 @@
 
     // --- Public methods ---
 
+    public GlRenderer(int queueDepth) {
+        mQueueDepth = queueDepth;
+        mGlProgramOverlay = new GlProgramOverlay(queueDepth);
+    }
+
     /**
      * Initializes the renderer.
      *
@@ -137,16 +143,15 @@
     /**
      * Creates an array of textures and return.
      *
-     * <p>This method creates an array of {@link GLES20#GL_TEXTURE_2D} textures and return their
-     * IDs. If the array already exists, calling this method deletes the current array before
-     * creating a new one.
+     * <p>This method creates an array of {@link GLES20#GL_TEXTURE_2D} textures with the
+     * {@link #mQueueDepth} from constructor, and return their IDs. If the array already exists,
+     * calling this method deletes the current array before creating a new one.
      *
-     * @param queueDepth the depth of the queue
-     * @param size       the size of the texture in this queue. The size usually matches the size
-     *                   of the input texture.
+     * @param size the size of the texture in this queue. The size usually matches the size
+     *             of the input texture.
      */
     @NonNull
-    public int[] createBufferTextureIds(int queueDepth, @NonNull Size size) {
+    public int[] createBufferTextureIds(@NonNull Size size) {
         checkGlThreadAndInitialized();
         // Delete the current buffer if it exists.
         if (mQueueTextureIds.length > 0) {
@@ -154,14 +159,14 @@
             checkGlErrorOrThrow("glDeleteTextures");
         }
 
-        mQueueTextureIds = new int[queueDepth];
+        mQueueTextureIds = new int[mQueueDepth];
         // If the queue depth is 0, return an empty array. There is no need to create textures.
-        if (queueDepth == 0) {
+        if (mQueueDepth == 0) {
             return mQueueTextureIds;
         }
 
         // Create the textures.
-        GLES20.glGenTextures(queueDepth, mQueueTextureIds, 0);
+        GLES20.glGenTextures(mQueueDepth, mQueueTextureIds, 0);
         checkGlErrorOrThrow("glGenTextures");
         mQueueTextureWidth = size.getWidth();
         mQueueTextureHeight = size.getHeight();
@@ -222,6 +227,7 @@
     public void renderInputToSurface(long timestampNs, @NonNull float[] textureTransform,
             @NonNull Surface surface) {
         checkGlThreadAndInitialized();
+        checkState(mQueueDepth == 0, "Queue depth must be zero");
         mGlProgramOverlay.draw(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mInputTextureId,
                 mOverlayTextureId, textureTransform, mGlContext, surface, timestampNs);
     }
@@ -236,6 +242,7 @@
     public void renderQueueTextureToSurface(int textureId, long timestampNs,
             @NonNull float[] textureTransform, @NonNull Surface surface) {
         checkGlThreadAndInitialized();
+        checkState(mQueueDepth > 0, "Queue depth must be non-zero");
         mGlProgramOverlay.draw(GLES20.GL_TEXTURE_2D, textureId, mOverlayTextureId,
                 textureTransform, mGlContext, surface, timestampNs);
     }
@@ -257,6 +264,7 @@
     public Bitmap renderQueueTextureToBitmap(int textureId, int width, int height,
             @NonNull float[] textureTransform) {
         checkGlThreadAndInitialized();
+        checkState(mQueueDepth > 0, "Queue depth must be non-zero");
         return mGlProgramOverlay.snapshot(GLES20.GL_TEXTURE_2D, textureId, mOverlayTextureId,
                 width, height, textureTransform);
     }
@@ -267,6 +275,7 @@
     @NonNull
     public Bitmap renderInputToBitmap(int width, int height, @NonNull float[] textureTransform) {
         checkGlThreadAndInitialized();
+        checkState(mQueueDepth == 0, "Queue depth must be zero");
         return mGlProgramOverlay.snapshot(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mInputTextureId,
                 mOverlayTextureId, width, height, textureTransform);
     }
diff --git a/camera/camera-effects/src/test/java/androidx/camera/effects/opengl/GlProgramOverlayTest.kt b/camera/camera-effects/src/test/java/androidx/camera/effects/opengl/GlProgramOverlayTest.kt
new file mode 100644
index 0000000..6c1695b
--- /dev/null
+++ b/camera/camera-effects/src/test/java/androidx/camera/effects/opengl/GlProgramOverlayTest.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.effects.opengl
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+/**
+ * Unit tests for [GlProgramOverlay].
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class GlProgramOverlayTest {
+
+    @Test
+    fun createWithNoQueue_usesExternalSampler() {
+        assertThat(GlProgramOverlay(0).fragmentShader)
+            .contains("uniform samplerExternalOES samplerInputTexture")
+    }
+
+    @Test
+    fun createWithQueue_uses2DSampler() {
+        assertThat(GlProgramOverlay(1).fragmentShader)
+            .contains("uniform sampler2D samplerInputTexture")
+    }
+}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraControl.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraControl.java
index 6cc162e..892971c 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraControl.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraControl.java
@@ -27,6 +27,7 @@
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.FocusMeteringResult;
 import androidx.camera.core.ImageCapture;
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl;
 import androidx.camera.core.ImageCaptureException;
 import androidx.camera.core.Logger;
 import androidx.camera.core.impl.CameraCaptureCallback;
@@ -94,6 +95,7 @@
     private float mLinearZoom = -1;
     private boolean mTorchEnabled = false;
     private int mExposureCompensation = -1;
+    private ScreenFlashUiControl mScreenFlashUiControl;
 
     @Nullable
     private FocusMeteringAction mLastSubmittedFocusMeteringAction = null;
@@ -209,6 +211,17 @@
     }
 
     @Override
+    public void setScreenFlashUiControl(@Nullable ScreenFlashUiControl screenFlashUiControl) {
+        mScreenFlashUiControl = screenFlashUiControl;
+        Logger.d(TAG, "setScreenFlashUiControl(" + mScreenFlashUiControl + ")");
+    }
+
+    @Nullable
+    public ScreenFlashUiControl getScreenFlashUiControl() {
+        return mScreenFlashUiControl;
+    }
+
+    @Override
     public void setZslDisabledByUserCaseConfig(boolean disabled) {
         mIsZslDisabledByUseCaseConfig = disabled;
     }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
index 8b28e6c..a028ba0 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
@@ -108,6 +108,11 @@
         this(cameraId, 0, CameraSelector.LENS_FACING_BACK);
     }
 
+    public FakeCameraInfoInternal(@NonNull String cameraId,
+            @CameraSelector.LensFacing int lensFacing) {
+        this(cameraId, 0, lensFacing);
+    }
+
     public FakeCameraInfoInternal(int sensorRotation, @CameraSelector.LensFacing int lensFacing) {
         this("0", sensorRotation, lensFacing);
     }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/impl/CameraUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/impl/CameraUtil.java
index 3349f00..99001ca 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/impl/CameraUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/impl/CameraUtil.java
@@ -1190,6 +1190,10 @@
             if (deviceHolder.get() == null) {
                 ret = false;
             }
+            if (Build.MODEL.equalsIgnoreCase("sm-g920v")) {
+                // Please see b/305835396
+                TimeUnit.SECONDS.sleep(1);
+            }
         } catch (Exception e) {
             ret = false;
         } finally {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/impl/mocks/MockScreenFlashUiControl.java b/camera/camera-testing/src/main/java/androidx/camera/testing/impl/mocks/MockScreenFlashUiControl.java
new file mode 100644
index 0000000..365c62d
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/impl/mocks/MockScreenFlashUiControl.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.testing.impl.mocks;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.ImageCapture;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A mock implementations of {@link ImageCapture.ScreenFlashUiControl} for testing purpose.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class MockScreenFlashUiControl implements ImageCapture.ScreenFlashUiControl {
+    /**
+     * Represents
+     * {@link ImageCapture.ScreenFlashUiControl#applyScreenFlashUi(ImageCapture.ScreenFlashUiCompleter)}
+     * event.
+     */
+    public static final int APPLY_SCREEN_FLASH = 0;
+    /**
+     * Represents {@link ImageCapture.ScreenFlashUiControl#clearScreenFlashUi()} event.
+     */
+    public static final int CLEAR_SCREEN_FLASH = 1;
+
+    /**
+     * The event types in {@link ImageCapture.ScreenFlashUiControl}.
+     */
+    @IntDef({APPLY_SCREEN_FLASH, CLEAR_SCREEN_FLASH})
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.TYPE_USE})
+    public @interface ScreenFlashUiEvent {
+    }
+
+    private final Object mLock = new Object();
+    private final List<@ScreenFlashUiEvent Integer> mEventList = new ArrayList<>();
+    private final CountDownLatch mScreenFlashUiClearLatch = new CountDownLatch(1);
+
+    /**
+     * Returns a list of {@link ScreenFlashUiEvent} in the same order as invoked.
+     */
+    @NonNull
+    public List<@ScreenFlashUiEvent Integer> getScreenFlashUiEvents() {
+        synchronized (mLock) {
+            return new ArrayList<>(mEventList);
+        }
+    }
+
+    /**
+     * Waits for {@link #clearScreenFlashUi} to be invoked once.
+     *
+     * @param timeoutInMillis The timeout of waiting in milliseconds.
+     * @return True if {@link #clearScreenFlashUi} was invoked, false if timed out.
+     */
+    public boolean awaitScreenFlashUiClear(long timeoutInMillis) {
+        try {
+            return mScreenFlashUiClearLatch.await(timeoutInMillis, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void applyScreenFlashUi(
+            @NonNull ImageCapture.ScreenFlashUiCompleter screenFlashUiCompleter) {
+        synchronized (mLock) {
+            mEventList.add(APPLY_SCREEN_FLASH);
+            screenFlashUiCompleter.complete();
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void clearScreenFlashUi() {
+        synchronized (mLock) {
+            mEventList.add(CLEAR_SCREEN_FLASH);
+            mScreenFlashUiClearLatch.countDown();
+        }
+    }
+}
diff --git a/camera/camera-testing/src/test/java/androidx/camera/testing/fakes/FakeCameraControlTest.java b/camera/camera-testing/src/test/java/androidx/camera/testing/fakes/FakeCameraControlTest.java
index e712626..16ce437cc 100644
--- a/camera/camera-testing/src/test/java/androidx/camera/testing/fakes/FakeCameraControlTest.java
+++ b/camera/camera-testing/src/test/java/androidx/camera/testing/fakes/FakeCameraControlTest.java
@@ -17,7 +17,6 @@
 package androidx.camera.testing.fakes;
 
 import static androidx.camera.testing.impl.fakes.FakeCameraDeviceSurfaceManager.MAX_OUTPUT_SIZE;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import android.graphics.Rect;
@@ -38,6 +37,7 @@
 import androidx.camera.core.impl.SessionConfig;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.testing.impl.fakes.FakeCameraCaptureResult;
+import androidx.camera.testing.impl.mocks.MockScreenFlashUiControl;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -216,6 +216,21 @@
     }
 
     @Test
+    public void canSetScreenFlashUiControl() {
+        ImageCapture.ScreenFlashUiControl screenFlashUiControl = new MockScreenFlashUiControl();
+        mCameraControl.setScreenFlashUiControl(screenFlashUiControl);
+        assertThat(mCameraControl.getScreenFlashUiControl()).isEqualTo(screenFlashUiControl);
+    }
+
+    @Test
+    public void canClearScreenFlashUiControl_afterEnable() {
+        ImageCapture.ScreenFlashUiControl screenFlashUiControl = new MockScreenFlashUiControl();
+        mCameraControl.setScreenFlashUiControl(screenFlashUiControl);
+        mCameraControl.setScreenFlashUiControl(null);
+        assertThat(mCameraControl.getScreenFlashUiControl()).isEqualTo(null);
+    }
+
+    @Test
     public void futureCompletesImmediately_whenTorchEnabled() {
         ListenableFuture<?> future = mCameraControl.enableTorch(true);
         assertThat(future.isDone()).isTrue();
diff --git a/camera/camera-testing/src/test/java/androidx/camera/testing/mocks/MockScreenFlashUiControlTest.kt b/camera/camera-testing/src/test/java/androidx/camera/testing/mocks/MockScreenFlashUiControlTest.kt
new file mode 100644
index 0000000..eeac01f
--- /dev/null
+++ b/camera/camera-testing/src/test/java/androidx/camera/testing/mocks/MockScreenFlashUiControlTest.kt
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.testing.mocks
+
+import android.annotation.SuppressLint
+import android.os.Build
+import androidx.camera.core.ImageCapture.ScreenFlashUiCompleter
+import androidx.camera.testing.impl.mocks.MockScreenFlashUiControl
+import androidx.camera.testing.impl.mocks.MockScreenFlashUiControl.APPLY_SCREEN_FLASH
+import androidx.camera.testing.impl.mocks.MockScreenFlashUiControl.CLEAR_SCREEN_FLASH
+import com.google.common.truth.Truth.assertThat
+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
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class MockScreenFlashUiControlTest {
+    private val dummyCompleter = ScreenFlashUiCompleter { }
+
+    private lateinit var mMockScreenFlashUiControl: MockScreenFlashUiControl
+
+    @Before
+    fun setUp() {
+        mMockScreenFlashUiControl = MockScreenFlashUiControl()
+    }
+
+    @Test
+    fun getScreenFlashUiEvents_invocationsRecordedExactlyInSameOrder() {
+        mMockScreenFlashUiControl.clearScreenFlashUi()
+        mMockScreenFlashUiControl.applyScreenFlashUi(dummyCompleter)
+        mMockScreenFlashUiControl.clearScreenFlashUi()
+
+        assertThat(mMockScreenFlashUiControl.screenFlashUiEvents).isEqualTo(listOf(
+            CLEAR_SCREEN_FLASH,
+            APPLY_SCREEN_FLASH,
+            CLEAR_SCREEN_FLASH,
+        ))
+    }
+
+    @Test
+    fun awaitScreenFlashUiApply_completerCompletedAutomaticallyByDefault() {
+        var isCompleted = false
+        val completer = ScreenFlashUiCompleter { isCompleted = true }
+        mMockScreenFlashUiControl.applyScreenFlashUi(completer)
+
+        assertThat(isCompleted).isTrue()
+    }
+
+    @Test
+    fun awaitScreenFlashUiClear_returnsFalseWhenClearScreenFlashUiNotInvoked() {
+        assertThat(mMockScreenFlashUiControl.awaitScreenFlashUiClear(3000)).isFalse()
+    }
+
+    @Test
+    fun awaitScreenFlashUiClear_returnsTrueWhenClearScreenFlashUiInvokedEarlier() {
+        mMockScreenFlashUiControl.clearScreenFlashUi()
+        assertThat(mMockScreenFlashUiControl.awaitScreenFlashUiClear(3000)).isTrue()
+    }
+
+    @SuppressLint("BanThreadSleep")
+    @Test
+    fun awaitScreenFlashUiClear_returnsTrueWhenClearScreenFlashUiInvokedLater() {
+        Thread({
+            try {
+                // ensure clearScreenFlashUi is not invoked immediately, but after some delay and
+                // from another thread
+                Thread.sleep(100)
+            } catch (e: InterruptedException) {
+                throw RuntimeException(e)
+            }
+            mMockScreenFlashUiControl.clearScreenFlashUi()
+        }, "test thread").start()
+
+        assertThat(mMockScreenFlashUiControl.awaitScreenFlashUiClear(3000)).isTrue()
+    }
+}
diff --git a/camera/camera-video/lint-baseline.xml b/camera/camera-video/lint-baseline.xml
index 6cb1056..6bb2b1ba 100644
--- a/camera/camera-video/lint-baseline.xml
+++ b/camera/camera-video/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Class requires API level 21 (current min is 14): `Status`"
+        message="Class requires API level 21 (current min is 19): `Status`"
         errorLine1="            is VideoRecordEvent.Status -> {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/camera/camera-view/api/current.txt b/camera/camera-view/api/current.txt
index 964bc06..2b6a82d 100644
--- a/camera/camera-view/api/current.txt
+++ b/camera/camera-view/api/current.txt
@@ -107,6 +107,7 @@
     method @UiThread public void setController(androidx.camera.view.CameraController?);
     method @UiThread public void setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode);
     method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
+    method @UiThread public void setScreenFlashWindow(android.view.Window?);
   }
 
   @RequiresApi(21) public enum PreviewView.ImplementationMode {
@@ -138,6 +139,16 @@
     method public void onRotationChanged(int);
   }
 
+  @RequiresApi(21) public final class ScreenFlashView extends android.view.View {
+    ctor @UiThread public ScreenFlashView(android.content.Context);
+    ctor @UiThread public ScreenFlashView(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public ScreenFlashView(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public ScreenFlashView(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public androidx.camera.core.ImageCapture.ScreenFlashUiControl? getScreenFlashUiControl();
+    method @UiThread public void setController(androidx.camera.view.CameraController?);
+    method @UiThread public void setScreenFlashWindow(android.view.Window?);
+  }
+
 }
 
 package androidx.camera.view.transform {
diff --git a/camera/camera-view/api/restricted_current.txt b/camera/camera-view/api/restricted_current.txt
index 964bc06..2b6a82d 100644
--- a/camera/camera-view/api/restricted_current.txt
+++ b/camera/camera-view/api/restricted_current.txt
@@ -107,6 +107,7 @@
     method @UiThread public void setController(androidx.camera.view.CameraController?);
     method @UiThread public void setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode);
     method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
+    method @UiThread public void setScreenFlashWindow(android.view.Window?);
   }
 
   @RequiresApi(21) public enum PreviewView.ImplementationMode {
@@ -138,6 +139,16 @@
     method public void onRotationChanged(int);
   }
 
+  @RequiresApi(21) public final class ScreenFlashView extends android.view.View {
+    ctor @UiThread public ScreenFlashView(android.content.Context);
+    ctor @UiThread public ScreenFlashView(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public ScreenFlashView(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public ScreenFlashView(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public androidx.camera.core.ImageCapture.ScreenFlashUiControl? getScreenFlashUiControl();
+    method @UiThread public void setController(androidx.camera.view.CameraController?);
+    method @UiThread public void setScreenFlashWindow(android.view.Window?);
+  }
+
 }
 
 package androidx.camera.view.transform {
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 154c4fd..471e5f0 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
@@ -20,6 +20,8 @@
 import static androidx.camera.core.impl.utils.executor.CameraXExecutors.directExecutor;
 import static androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor;
 import static androidx.camera.core.impl.utils.futures.Futures.transform;
+import static androidx.camera.view.internal.ScreenFlashUiInfo.ProviderType.PREVIEW_VIEW;
+import static androidx.camera.view.internal.ScreenFlashUiInfo.ProviderType.SCREEN_FLASH_VIEW;
 import static androidx.core.content.ContextCompat.getMainExecutor;
 
 import android.Manifest;
@@ -30,6 +32,7 @@
 import android.os.Build;
 import android.util.Range;
 import android.util.Size;
+import android.view.Window;
 
 import androidx.annotation.DoNotInline;
 import androidx.annotation.FloatRange;
@@ -55,6 +58,7 @@
 import androidx.camera.core.FocusMeteringResult;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.ImageCapture;
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.InitializationException;
 import androidx.camera.core.Logger;
@@ -85,6 +89,7 @@
 import androidx.camera.video.Recording;
 import androidx.camera.video.VideoCapture;
 import androidx.camera.video.VideoRecordEvent;
+import androidx.camera.view.internal.ScreenFlashUiInfo;
 import androidx.camera.view.video.AudioConfig;
 import androidx.core.content.PermissionChecker;
 import androidx.core.util.Consumer;
@@ -215,6 +220,20 @@
      */
     public static final int VIDEO_CAPTURE = 1 << 2;
 
+    private static final ScreenFlashUiControl NO_OP_SCREEN_FLASH_UI_CONTROL =
+            new ScreenFlashUiControl() {
+                @Override
+                public void applyScreenFlashUi(
+                        @NonNull ImageCapture.ScreenFlashUiCompleter screenFlashUiCompleter) {
+                    screenFlashUiCompleter.complete();
+                }
+
+                @Override
+                public void clearScreenFlashUi() {
+
+                }
+            };
+
     CameraSelector mCameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;
 
     // By default, ImageCapture and ImageAnalysis are enabled. VideoCapture is disabled.
@@ -337,6 +356,8 @@
     @NonNull
     private final ListenableFuture<Void> mInitializationFuture;
 
+    private final Map<ScreenFlashUiInfo.ProviderType, ScreenFlashUiInfo>
+            mScreenFlashUiInfoMap = new HashMap<>();
 
     CameraController(@NonNull Context context) {
         this(context, transform(ProcessCameraProvider.getInstance(context),
@@ -716,15 +737,96 @@
      *
      * <p>If not set, the flash mode will default to {@link ImageCapture#FLASH_MODE_OFF}.
      *
+     * <p>If {@link ImageCapture#FLASH_MODE_SCREEN} is set, a valid {@link android.view.Window}
+     * instance must be set to a {@link PreviewView} or {@link ScreenFlashView} which this
+     * controller is set to. Trying to use {@link ImageCapture#FLASH_MODE_SCREEN} with a
+     * non-front camera or without setting a non-null window will be no-op. While switching the
+     * camera, it is the application's responsibility to change flash mode to the desired one if
+     * it leads to a no-op case (e.g. switching to rear camera while {@code FLASH_MODE_SCREEN} is
+     * still set). Otherwise, {@code FLASH_MODE_OFF} will be set.
+     *
      * @param flashMode the flash mode for {@link ImageCapture}.
+     *
+     * @throws IllegalArgumentException If flash mode is invalid or FLASH_MODE_SCREEN is used
+     *                                  without a front camera.
+     *
+     * @see PreviewView#setScreenFlashWindow(Window)
+     * @see ScreenFlashView#setScreenFlashWindow(Window)
      */
     @MainThread
     public void setImageCaptureFlashMode(@ImageCapture.FlashMode int flashMode) {
         checkMainThread();
+
+        if (flashMode == ImageCapture.FLASH_MODE_SCREEN) {
+            Integer lensFacing = mCameraSelector.getLensFacing();
+            if (lensFacing != null && lensFacing != CameraSelector.LENS_FACING_FRONT) {
+                throw new IllegalArgumentException(
+                        "Not a front camera despite setting FLASH_MODE_SCREEN");
+            }
+
+            updateScreenFlashUiControlToImageCapture();
+        }
+
         mImageCapture.setFlashMode(flashMode);
     }
 
     /**
+     * Internal API used by {@link PreviewView} and {@link ScreenFlashView} to provide a
+     * {@link ScreenFlashUiControl}.
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public void setScreenFlashUiInfo(@NonNull ScreenFlashUiInfo screenFlashUiInfo) {
+        ScreenFlashUiInfo previousInfo = getScreenFlashUiInfoByPriority();
+        mScreenFlashUiInfoMap.put(screenFlashUiInfo.getProviderType(), screenFlashUiInfo);
+        ScreenFlashUiInfo prioritizedInfo = getScreenFlashUiInfoByPriority();
+        if (prioritizedInfo != null && !prioritizedInfo.equals(previousInfo)) {
+            updateScreenFlashUiControlToImageCapture();
+        }
+    }
+
+    /**
+     * Internal API used by {@link PreviewView} and {@link ScreenFlashView} to update screen
+     * flash mode to ImageCapture in case it's pending.
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public void updateScreenFlashUiControlToImageCapture() {
+        ScreenFlashUiInfo screenFlashUiInfo = getScreenFlashUiInfoByPriority();
+
+        if (screenFlashUiInfo == null) {
+            // PreviewView/ScreenFlashView may have not been attached yet, so setting a NO-OP
+            // ScreenFlashUiControl until one of the views is attached
+            Logger.d(TAG, "No ScreenFlashUiControl set yet, need to wait for "
+                    + "controller to be set to either ScreenFlashView or PreviewView");
+            mImageCapture.setScreenFlashUiControl(NO_OP_SCREEN_FLASH_UI_CONTROL);
+            return;
+        }
+
+        mImageCapture.setScreenFlashUiControl(screenFlashUiInfo.getScreenFlashUiControl());
+        Logger.d(TAG, "Set ScreenFlashUiControl to ImageCapture, provided by "
+                + screenFlashUiInfo.getProviderType().name());
+    }
+
+    /**
+     * Returns a {@link ScreenFlashUiInfo} by prioritizing {@link ScreenFlashView} over
+     * {@link PreviewView}.
+     *
+     * <p> PreviewView always has a ScreenFlashView internally and does not know if user is
+     * using another ScreenFlashView themselves. This API prioritizes user's ScreenFlashView over
+     * the internal one in PreviewView and provides the ScreenFlashUiControlProvider accordingly.
+     */
+    @Nullable
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public ScreenFlashUiInfo getScreenFlashUiInfoByPriority() {
+        if (mScreenFlashUiInfoMap.get(SCREEN_FLASH_VIEW) != null) {
+            return mScreenFlashUiInfoMap.get(SCREEN_FLASH_VIEW);
+        }
+        if (mScreenFlashUiInfoMap.get(PREVIEW_VIEW) != null) {
+            return mScreenFlashUiInfoMap.get(PREVIEW_VIEW);
+        }
+        return null;
+    }
+
+    /**
      * Captures a new still image and saves to a file along with application specified metadata.
      *
      * <p>The callback will be called only once for every invocation of this method.
@@ -741,6 +843,12 @@
      * @param outputFileOptions  Options to store the newly captured image.
      * @param executor           The executor in which the callback methods will be run.
      * @param imageSavedCallback Callback to be called for the newly captured image.
+     *
+     * @throws IllegalStateException If {@link ImageCapture#FLASH_MODE_SCREEN} is set to the
+     *                               {@link CameraController}, but a non-null {@link Window}
+     *                               instance has not been set with
+     *                               {@link PreviewView#setScreenFlashWindow}.
+     *
      * @see ImageCapture#takePicture(
      *ImageCapture.OutputFileOptions, Executor, ImageCapture.OnImageSavedCallback)
      */
@@ -753,6 +861,8 @@
         Preconditions.checkState(isCameraInitialized(), CAMERA_NOT_INITIALIZED);
         Preconditions.checkState(isImageCaptureEnabled(), IMAGE_CAPTURE_DISABLED);
 
+        throwExceptionForInvalidScreenFlashCapture();
+
         updateMirroringFlagInOutputFileOptions(outputFileOptions);
         mImageCapture.takePicture(outputFileOptions, executor, imageSavedCallback);
     }
@@ -781,6 +891,12 @@
      *
      * @param executor The executor in which the callback methods will be run.
      * @param callback Callback to be invoked for the newly captured image
+     *
+     * @throws IllegalStateException If {@link ImageCapture#FLASH_MODE_SCREEN} is set to the
+     *                               {@link CameraController}, but a non-null {@link Window}
+     *                               instance has not been set with
+     *                               {@link PreviewView#setScreenFlashWindow}.
+     *
      * @see ImageCapture#takePicture(Executor, ImageCapture.OnImageCapturedCallback)
      */
     @MainThread
@@ -791,9 +907,22 @@
         Preconditions.checkState(isCameraInitialized(), CAMERA_NOT_INITIALIZED);
         Preconditions.checkState(isImageCaptureEnabled(), IMAGE_CAPTURE_DISABLED);
 
+        throwExceptionForInvalidScreenFlashCapture();
+
         mImageCapture.takePicture(executor, callback);
     }
 
+    private void throwExceptionForInvalidScreenFlashCapture() {
+        if (getImageCaptureFlashMode() == ImageCapture.FLASH_MODE_SCREEN && (
+                getScreenFlashUiInfoByPriority() == null
+                        || getScreenFlashUiInfoByPriority().getScreenFlashUiControl() == null)) {
+            // ScreenFlashUiControl won't be found at this point only if a non-null window was not
+            // set to PreviewView.
+            throw new IllegalStateException(
+                    "No window set in PreviewView despite setting FLASH_MODE_SCREEN");
+        }
+    }
+
     /**
      * Sets the image capture mode.
      *
@@ -1726,6 +1855,12 @@
             return;
         }
 
+        Integer lensFacing = cameraSelector.getLensFacing();
+        if (mImageCapture.getFlashMode() == ImageCapture.FLASH_MODE_SCREEN && lensFacing != null
+                && lensFacing != CameraSelector.LENS_FACING_FRONT) {
+            throw new IllegalStateException("Not a front camera despite setting FLASH_MODE_SCREEN");
+        }
+
         CameraSelector oldCameraSelector = mCameraSelector;
         mCameraSelector = cameraSelector;
 
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 cb853a1..89574f7 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
@@ -22,6 +22,7 @@
 import static androidx.core.content.ContextCompat.getMainExecutor;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.graphics.Bitmap;
@@ -44,9 +45,12 @@
 import android.view.TextureView;
 import android.view.View;
 import android.view.ViewConfiguration;
+import android.view.Window;
 import android.widget.FrameLayout;
+import android.widget.LinearLayout;
 
 import androidx.annotation.AnyThread;
+import androidx.annotation.ColorInt;
 import androidx.annotation.ColorRes;
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
@@ -61,6 +65,8 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.ImageAnalysis;
+import androidx.camera.core.ImageCapture;
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl;
 import androidx.camera.core.Logger;
 import androidx.camera.core.MeteringPoint;
 import androidx.camera.core.MeteringPointFactory;
@@ -73,6 +79,7 @@
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.ImageOutputConfig;
 import androidx.camera.core.impl.utils.Threads;
+import androidx.camera.view.internal.ScreenFlashUiInfo;
 import androidx.camera.view.internal.compat.quirk.DeviceQuirks;
 import androidx.camera.view.internal.compat.quirk.SurfaceViewNotCroppedByParentQuirk;
 import androidx.camera.view.internal.compat.quirk.SurfaceViewStretchedQuirk;
@@ -80,6 +87,7 @@
 import androidx.camera.view.transform.OutputTransform;
 import androidx.core.content.ContextCompat;
 import androidx.core.view.ViewCompat;
+import androidx.fragment.app.Fragment;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
@@ -131,6 +139,9 @@
     PreviewViewImplementation mImplementation;
 
     @NonNull
+    final ScreenFlashView mScreenFlashView;
+
+    @NonNull
     final PreviewTransformation mPreviewTransform = new PreviewTransformation();
     boolean mUseDisplayRotation = true;
 
@@ -261,6 +272,12 @@
                 camera.getCameraState().removeObserver(streamStateObserver);
             });
 
+            // PreviewViewImplementation#onSurfaceRequested may remove all child views, check if
+            // ScreenFlashView needs to be re-added
+            if (PreviewView.this.indexOfChild(mScreenFlashView) == -1) {
+                PreviewView.this.addView(mScreenFlashView);
+            }
+
             if (mOnFrameUpdateListener != null && mOnFrameUpdateListenerExecutor != null) {
                 mImplementation.setFrameUpdateListener(mOnFrameUpdateListenerExecutor,
                         mOnFrameUpdateListener);
@@ -315,6 +332,11 @@
         if (getBackground() == null) {
             setBackgroundColor(ContextCompat.getColor(getContext(), DEFAULT_BACKGROUND_COLOR));
         }
+
+        mScreenFlashView = new ScreenFlashView(context);
+        mScreenFlashView.setLayoutParams(new LinearLayout.LayoutParams(
+                LinearLayout.LayoutParams.MATCH_PARENT,
+                LinearLayout.LayoutParams.MATCH_PARENT));
     }
 
     @Override
@@ -947,9 +969,11 @@
             // If already bound to a different controller, ask the old controller to stop
             // using this PreviewView.
             mCameraController.clearPreviewSurface();
+            setScreenFlashUiInfo(null);
         }
         mCameraController = cameraController;
         attachToControllerIfReady(/*shouldFailSilently=*/false);
+        setScreenFlashUiInfo(getScreenFlashUiControl());
     }
 
     /**
@@ -1055,6 +1079,15 @@
         }
     }
 
+    private void setScreenFlashUiInfo(ScreenFlashUiControl control) {
+        if (mCameraController == null) {
+            Logger.d(TAG, "setScreenFlashUiControl: mCameraController is null!");
+            return;
+        }
+        mCameraController.setScreenFlashUiInfo(new ScreenFlashUiInfo(
+                ScreenFlashUiInfo.ProviderType.PREVIEW_VIEW, control));
+    }
+
     private void startListeningToDisplayChange() {
         DisplayManager displayManager = getDisplayManager();
         if (displayManager == null) {
@@ -1083,6 +1116,62 @@
     }
 
     /**
+     * Sets a {@link Window} instance for subsequent photo capture requests with
+     * {@link ImageCapture#FLASH_MODE_SCREEN} set.
+     *
+     * <p>The calling of this API will take effect for {@link ImageCapture#FLASH_MODE_SCREEN} only
+     * and the {@code Window} will be ignored for other flash modes. During screen flash photo
+     * capture, the window is used for the purpose of changing brightness.
+     *
+     * <p>If the implementation provided by the user is no longer valid (e.g. due to any
+     * {@link android.app.Activity} or {@link android.view.View} reference used in the
+     * implementation becoming invalid), user needs to re-set a new valid window or
+     * clear the previous one with {@code setScreenFlashWindow(null)}, whichever appropriate.
+     *
+     * <p>For most app scenarios, a {@link Window} instance can be obtained from
+     * {@link Activity#getWindow()}. In case of a fragment, {@link Fragment#getActivity()} can
+     * first be used to get the activity instance.
+     *
+     * @param screenFlashWindow A {@link Window} instance that is used to change the brightness
+     *                          during screen flash photo capture.
+     */
+    @UiThread
+    public void setScreenFlashWindow(@Nullable Window screenFlashWindow) {
+        checkMainThread();
+        mScreenFlashView.setScreenFlashWindow(screenFlashWindow);
+        setScreenFlashUiInfo(getScreenFlashUiControl());
+    }
+
+    /**
+     * Returns an {@link ScreenFlashUiControl} implementation based
+     * on the {@link Window} instance set via {@link #setScreenFlashWindow(Window)}.
+     *
+     * <p> This API uses an internally managed {@link ScreenFlashView} to provide the
+     * {@link ScreenFlashUiControl} implementation.
+     *
+     * @return An {@link ScreenFlashUiControl} implementation provided by
+     *         {@link ScreenFlashView#getScreenFlashUiControl()}.
+     */
+    @UiThread
+    @Nullable
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public ScreenFlashUiControl getScreenFlashUiControl() {
+        return mScreenFlashView.getScreenFlashUiControl();
+    }
+
+    /**
+     * Sets the color of the top overlay view during screen flash.
+     *
+     * @param color The color value of the top overlay.
+     *
+     * @see #getScreenFlashUiControl()
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public void setScreenFlashOverlayColor(@ColorInt int color) {
+        mScreenFlashView.setBackgroundColor(color);
+    }
+
+    /**
      * Listener for display rotation changes.
      *
      * <p> When the device is rotated 180° from side to side, the activity is not
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/ScreenFlashView.java b/camera/camera-view/src/main/java/androidx/camera/view/ScreenFlashView.java
new file mode 100644
index 0000000..a6cf31e
--- /dev/null
+++ b/camera/camera-view/src/main/java/androidx/camera/view/ScreenFlashView.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 static androidx.camera.core.ImageCapture.FLASH_MODE_SCREEN;
+import static androidx.camera.core.impl.utils.Threads.checkMainThread;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Color;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.UiThread;
+import androidx.camera.core.ImageCapture;
+import androidx.camera.core.ImageCapture.ScreenFlashUiCompleter;
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl;
+import androidx.camera.core.Logger;
+import androidx.camera.view.internal.ScreenFlashUiInfo;
+import androidx.fragment.app.Fragment;
+
+/**
+ * Custom View that implements a basic UI for screen flash photo capture.
+ *
+ * <p> This class provides an {@link ScreenFlashUiControl} implementation with
+ * {@link #getScreenFlashUiControl()} for the
+ * {@link ImageCapture#setScreenFlashUiControl(ScreenFlashUiControl)} API. If a
+ * {@link CameraController} is used for CameraX operations,{@link #setController(CameraController)}
+ * should be used to set the controller to this view. Normally, this view is kept fully
+ * transparent. It becomes fully visible for the duration of screen flash photo capture. The
+ * screen brightness is also maximized for that duration.
+ *
+ * <p> The default color of the view is {@link Color#WHITE}, but it can be changed with
+ * {@link View#setBackgroundColor(int)} API. The elevation of this view is always set to
+ * {@link Float#MAX_VALUE} so that it always appears on top in its view hierarchy during screen
+ * flash.
+ *
+ * <p> This view is also used internally in {@link PreviewView}, so may not be required if user
+ * is already using {@link PreviewView}. However, note that the internal instance of
+ * {@link PreviewView} has the same dimensions as {@link PreviewView}. So if the
+ * {@link PreviewView} does not encompass the full screen, users may want to use this view
+ * separately so that whole screen can be encompassed during screen flash operation.
+ *
+ * @see ImageCapture#FLASH_MODE_SCREEN
+ * @see PreviewView#getScreenFlashUiControl
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class ScreenFlashView extends View {
+    private static final String TAG = "ScreenFlashView";
+    private CameraController mCameraController;
+    private Window mScreenFlashWindow;
+    private ScreenFlashUiControl mScreenFlashUiControl;
+
+    @UiThread
+    public ScreenFlashView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    @UiThread
+    public ScreenFlashView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    @UiThread
+    public ScreenFlashView(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
+        this(context, attrs,  defStyleAttr, 0);
+    }
+
+    @UiThread
+    public ScreenFlashView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+
+        setBackgroundColor(Color.WHITE);
+        setAlpha(0f);
+        setElevation(Float.MAX_VALUE);
+    }
+
+    /**
+     * Sets {@link ScreenFlashUiInfo} to a {@link CameraController}.
+     *
+     * <p> Once set, the controller will use {@link ScreenFlashView} for screen flash related UI
+     * operations.
+     *
+     * @throws IllegalStateException If {@link ImageCapture#FLASH_MODE_SCREEN} is set to the
+     *                               {@link CameraController}, but a non-null {@link Window}
+     *                               instance has not been set with {@link #setScreenFlashWindow}.
+     * @see CameraController
+     */
+    @UiThread
+    public void setController(@Nullable CameraController cameraController) {
+        checkMainThread();
+
+        if (mCameraController != null && mCameraController != cameraController) {
+            // If already bound to a different controller, remove the ScreenFlashUiControl from the
+            // old controller.
+            setScreenFlashUiInfo(null);
+        }
+        mCameraController = cameraController;
+
+        if (cameraController == null) {
+            return;
+        }
+
+        if (cameraController.getImageCaptureFlashMode() == FLASH_MODE_SCREEN
+                && mScreenFlashWindow == null) {
+            throw new IllegalStateException(
+                    "No window set despite setting FLASH_MODE_SCREEN in CameraController");
+        }
+
+        setScreenFlashUiInfo(getScreenFlashUiControl());
+    }
+
+    private void setScreenFlashUiInfo(ScreenFlashUiControl control) {
+        if (mCameraController == null) {
+            Logger.d(TAG, "setScreenFlashUiControl: mCameraController is null!");
+            return;
+        }
+        mCameraController.setScreenFlashUiInfo(new ScreenFlashUiInfo(
+                        ScreenFlashUiInfo.ProviderType.SCREEN_FLASH_VIEW, control));
+    }
+
+    /**
+     * Sets a {@link Window} instance for subsequent photo capture requests with
+     * {@link ImageCapture} use case when{@link ImageCapture#FLASH_MODE_SCREEN} is set.
+     *
+     * <p>The calling of this API will take effect for {@code ImageCapture#FLASH_MODE_SCREEN} only
+     * and the {@code Window} will be ignored for other flash modes. During screen flash photo
+     * capture, the window is used for the purpose of changing screen brightness.
+     *
+     * <p> If the implementation provided by the user is no longer valid (e.g. due to any
+     * {@link android.app.Activity} or {@link android.view.View} reference used in the
+     * implementation becoming invalid), user needs to re-set a new valid window or clear the
+     * previous one with {@code setScreenFlashWindow(null)}, whichever appropriate.
+     *
+     * <p>For most app scenarios, a {@code Window} instance can be obtained from
+     * {@link Activity#getWindow()}. In case of a fragment, {@link Fragment#getActivity()} can
+     * first be used to get the activity instance.
+     *
+     * @param screenFlashWindow A {@link Window} instance that is used to change the brightness
+     *                          during screen flash photo capture.
+     */
+    @UiThread
+    public void setScreenFlashWindow(@Nullable Window screenFlashWindow) {
+        checkMainThread();
+        updateScreenFlashUiControl(screenFlashWindow);
+        mScreenFlashWindow = screenFlashWindow;
+        setScreenFlashUiInfo(getScreenFlashUiControl());
+    }
+
+    /** Update {@link #mScreenFlashUiControl} if required. */
+    private void updateScreenFlashUiControl(Window window) {
+        if (mScreenFlashWindow != window) {
+            mScreenFlashUiControl = window == null ? null : new ScreenFlashUiControl() {
+                private float mPreviousBrightness;
+
+                @Override
+                public void applyScreenFlashUi(
+                        @NonNull ScreenFlashUiCompleter screenFlashUiCompleter) {
+                    Logger.d(TAG, "ScreenFlashUiControl#applyScreenFlashUi");
+
+                    setAlpha(1f);
+
+                    // Maximize screen brightness
+                    WindowManager.LayoutParams layoutParam = mScreenFlashWindow.getAttributes();
+                    mPreviousBrightness = layoutParam.screenBrightness;
+                    layoutParam.screenBrightness = 1F;
+                    mScreenFlashWindow.setAttributes(layoutParam);
+
+                    screenFlashUiCompleter.complete();
+                }
+
+                @Override
+                public void clearScreenFlashUi() {
+                    Logger.d(TAG, "ScreenFlashUiControl#clearScreenFlashUi");
+
+                    setAlpha(0f);
+
+                    // Restore screen brightness
+                    WindowManager.LayoutParams layoutParam = mScreenFlashWindow.getAttributes();
+                    layoutParam.screenBrightness = mPreviousBrightness;
+                    mScreenFlashWindow.setAttributes(layoutParam);
+                }
+            };
+        }
+    }
+
+    /**
+     * Returns an {@link ScreenFlashUiControl} implementation based on the {@link Window} instance
+     * set via {@link #setScreenFlashWindow(Window)}.
+     *
+     * <p> When {@link ScreenFlashUiControl#applyScreenFlashUi(ScreenFlashUiCompleter)} is invoked,
+     * this view becomes fully visible and screen brightness is maximized using the provided
+     * {@code Window}. The default color of the overlay view is {@link Color#WHITE}. To change
+     * the color, use {@link #setBackgroundColor(int)}.
+     *
+     * <p> When {@link ScreenFlashUiControl#clearScreenFlashUi()} is invoked, the view
+     * becomes transparent and screen brightness is restored.
+     *
+     * <p> The {@code Window} instance parameter can usually be provided from the activity using
+     * the {@link PreviewView}, see {@link Activity#getWindow()} for details. If a null {@code
+     * Window} is set or none set at all, a null value will be returned by this method.
+     *
+     * @return A simple {@link ScreenFlashUiControl} implementation, or null value if a non-null
+     *         {@code Window} instance hasn't been set.
+     */
+    @UiThread
+    @Nullable
+    public ScreenFlashUiControl getScreenFlashUiControl() {
+        return mScreenFlashUiControl;
+    }
+}
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/internal/ScreenFlashUiInfo.java b/camera/camera-view/src/main/java/androidx/camera/view/internal/ScreenFlashUiInfo.java
new file mode 100644
index 0000000..979dc56
--- /dev/null
+++ b/camera/camera-view/src/main/java/androidx/camera/view/internal/ScreenFlashUiInfo.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.internal;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.camera.core.ImageCapture;
+import androidx.camera.view.CameraController;
+import androidx.camera.view.PreviewView;
+import androidx.camera.view.ScreenFlashView;
+
+import java.util.Objects;
+
+/**
+ * Internal data class that encapsulates an {@link ImageCapture.ScreenFlashUiControl} and its
+ * provider.
+ */
+public class ScreenFlashUiInfo {
+    /**
+     * Since {@link ImageCapture.ScreenFlashUiControl} can be created from either the
+     * {@link ScreenFlashView} set by user or the one internally used in {@link PreviewView},
+     * {@link CameraController} needs to know where exactly the control is from so that it can
+     * prioritize the user-set one when both are available.
+     */
+    public enum ProviderType {
+        PREVIEW_VIEW,
+        SCREEN_FLASH_VIEW
+    }
+
+    @NonNull
+    private final ProviderType mProviderType;
+
+    @Nullable
+    private final ImageCapture.ScreenFlashUiControl mScreenFlashUiControl;
+
+    public ScreenFlashUiInfo(@NonNull ProviderType providerType,
+            @Nullable ImageCapture.ScreenFlashUiControl screenFlashUiControl) {
+        mProviderType = providerType;
+        mScreenFlashUiControl = screenFlashUiControl;
+    }
+
+    @NonNull
+    public ProviderType getProviderType() {
+        return mProviderType;
+    }
+
+    @Nullable
+    public ImageCapture.ScreenFlashUiControl getScreenFlashUiControl() {
+        return mScreenFlashUiControl;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ScreenFlashUiInfo)) return false;
+        ScreenFlashUiInfo that = (ScreenFlashUiInfo) o;
+        return mProviderType == that.mProviderType && Objects.equals(mScreenFlashUiControl,
+                that.mScreenFlashUiControl);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mProviderType, mScreenFlashUiControl);
+    }
+}
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/package-info.java b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/package-info.java
deleted file mode 100644
index 990fa54..0000000
--- a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/package-info.java
+++ /dev/null
@@ -1,22 +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.
- */
-
-/**
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-package androidx.camera.view.internal.compat.quirk;
-
-import androidx.annotation.RestrictTo;
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/internal/package-info.java b/camera/camera-view/src/main/java/androidx/camera/view/internal/package-info.java
new file mode 100644
index 0000000..cb22ed3
--- /dev/null
+++ b/camera/camera-view/src/main/java/androidx/camera/view/internal/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.view.internal;
+
+import androidx.annotation.RestrictTo;
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 a283985..845d9c9 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
@@ -30,6 +30,7 @@
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageAnalysis.COORDINATE_SYSTEM_ORIGINAL
 import androidx.camera.core.ImageCapture
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl
 import androidx.camera.core.ImageProxy
 import androidx.camera.core.MirrorMode
 import androidx.camera.core.TorchState
@@ -49,11 +50,14 @@
 import androidx.camera.video.Quality
 import androidx.camera.video.QualitySelector
 import androidx.camera.view.CameraController.COORDINATE_SYSTEM_VIEW_REFERENCED
+import androidx.camera.view.internal.ScreenFlashUiInfo
 import androidx.concurrent.futures.CallbackToFutureAdapter
 import androidx.test.annotation.UiThreadTest
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
+import com.google.common.util.concurrent.MoreExecutors
 import java.util.concurrent.Executors
+import org.junit.Assert
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -505,4 +509,76 @@
         // Assert.
         assertThat(controller.cameraSelector.lensFacing).isEqualTo(CameraSelector.LENS_FACING_FRONT)
     }
+
+    @Test
+    fun throwsException_whenScreenFlashModeSetWithBackCamera() {
+        controller.cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+
+        Assert.assertThrows(IllegalArgumentException::class.java) {
+            controller.imageCaptureFlashMode = ImageCapture.FLASH_MODE_SCREEN
+        }
+    }
+
+    @Test
+    fun canSetScreenFlashMode_whenScreenFlashUiInfoNotSetYet() {
+        controller.cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
+        controller.imageCaptureFlashMode = ImageCapture.FLASH_MODE_SCREEN
+
+        assertThat(controller.imageCaptureFlashMode).isEqualTo(ImageCapture.FLASH_MODE_SCREEN)
+    }
+
+    @Test
+    fun canTakePictureWithScreenFlashMode_whenFrontCameraAndScreenFlashUiInfoSet() {
+        controller.cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
+        controller.setScreenFlashUiInfo(
+            ScreenFlashUiInfo(
+                ScreenFlashUiInfo.ProviderType.SCREEN_FLASH_VIEW,
+                object : ScreenFlashUiControl {
+                    override fun applyScreenFlashUi(
+                        screenFlashUiCompleter: ImageCapture.ScreenFlashUiCompleter
+                    ) {
+                        screenFlashUiCompleter.complete()
+                    }
+
+                    override fun clearScreenFlashUi() {
+                    }
+                }
+            )
+        )
+
+        controller.imageCaptureFlashMode = ImageCapture.FLASH_MODE_SCREEN
+        completeCameraInitialization()
+
+        controller.takePicture(
+            MoreExecutors.directExecutor(),
+            object : ImageCapture.OnImageCapturedCallback() {}
+        )
+
+        // ensure FLASH_MODE_SCREEN was retained
+        assertThat(controller.imageCaptureFlashMode).isEqualTo(ImageCapture.FLASH_MODE_SCREEN)
+    }
+
+    @Test
+    fun throwException_whenTakePictureWithScreenFlashModeButWithoutScreenFlashUiInfo() {
+        controller.cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
+        controller.imageCaptureFlashMode = ImageCapture.FLASH_MODE_SCREEN
+        completeCameraInitialization()
+
+        Assert.assertThrows(IllegalStateException::class.java) {
+            controller.takePicture(
+                MoreExecutors.directExecutor(),
+                object : ImageCapture.OnImageCapturedCallback() {}
+            )
+        }
+    }
+
+    @Test
+    fun throwsException_whenSwitchToBackCameraAfterScreenFlashSetToFrontCamera() {
+        controller.cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
+        controller.imageCaptureFlashMode = ImageCapture.FLASH_MODE_SCREEN
+
+        Assert.assertThrows(IllegalStateException::class.java) {
+            controller.cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+        }
+    }
 }
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/PreviewViewTest.java b/camera/camera-view/src/test/java/androidx/camera/view/PreviewViewTest.java
index fb1c45d..34d0b41 100644
--- a/camera/camera-view/src/test/java/androidx/camera/view/PreviewViewTest.java
+++ b/camera/camera-view/src/test/java/androidx/camera/view/PreviewViewTest.java
@@ -18,11 +18,14 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.content.Context;
 import android.os.Build;
 import android.util.Size;
+import android.view.Window;
 import android.widget.FrameLayout;
 
 import androidx.camera.core.CameraInfo;
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.testing.fakes.FakeCamera;
@@ -33,16 +36,32 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.After;
+import org.junit.Assume;
+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 org.robolectric.shadows.ShadowWindow;
 
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 public class PreviewViewTest {
+    private final Context mAppContext = ApplicationProvider.getApplicationContext();
+    private PreviewView mPreviewView;
+    private Window mWindow;
+
+    @Before
+    public void setUp() {
+        mPreviewView = new PreviewView(mAppContext);
+        try {
+            mWindow = ShadowWindow.create(mAppContext);
+        } catch (ClassNotFoundException e) {
+            Assume.assumeTrue("Failed to create shadow window", false);
+        }
+    }
 
     @After
     public void tearDown() {
@@ -135,10 +154,64 @@
         previewView.setImplementationMode(PreviewView.ImplementationMode.PERFORMANCE);
     }
 
+    @Test
+    public void canCreateValidScreenFlashUiControlImpl() {
+        ScreenFlashUiControl uiControl = createScreenFlashUiControl(false);
+        assertThat(uiControl).isNotNull();
+    }
+
+    @Test
+    public void validScreenFlashUiControlSetToCameraController_whenWindowSetAndThenControllerSet() {
+        CameraController cameraController = new LifecycleCameraController(mAppContext);
+
+        mPreviewView.setScreenFlashWindow(mWindow);
+        mPreviewView.setController(cameraController);
+
+        assertThat(cameraController.getScreenFlashUiInfoByPriority()).isNotNull();
+        assertThat(
+                cameraController.getScreenFlashUiInfoByPriority().getScreenFlashUiControl()
+        ).isNotNull();
+    }
+
+    @Test
+    public void validScreenFlashUiControlSetToCameraController_whenControllerSetAndThenWindowSet() {
+        CameraController cameraController = new LifecycleCameraController(mAppContext);
+
+        mPreviewView.setController(cameraController);
+        mPreviewView.setScreenFlashWindow(mWindow);
+
+        assertThat(cameraController.getScreenFlashUiInfoByPriority()).isNotNull();
+        assertThat(
+                cameraController.getScreenFlashUiInfoByPriority().getScreenFlashUiControl()
+        ).isNotNull();
+    }
+
+    @Test
+    public void nullScreenFlashUiControlSetToCameraController_whenControllerSetButNoWindowSet() {
+        CameraController cameraController = new LifecycleCameraController(mAppContext);
+
+        mPreviewView.setController(cameraController);
+
+        if (cameraController.getScreenFlashUiInfoByPriority() != null) {
+            assertThat(
+                    cameraController.getScreenFlashUiInfoByPriority().getScreenFlashUiControl()
+            ).isNull();
+        }
+    }
+
     private SurfaceRequest createSurfaceRequestCompatibleWithSurfaceView() {
         FakeCameraInfoInternal cameraInfoInternal = new FakeCameraInfoInternal();
         cameraInfoInternal.setImplementationType(CameraInfo.IMPLEMENTATION_TYPE_CAMERA2);
         return new SurfaceRequest(new Size(800, 600),
                 new FakeCamera(null, cameraInfoInternal), () -> {});
     }
+
+    private ScreenFlashUiControl createScreenFlashUiControl(boolean assumeNoFailure) {
+        mPreviewView.setScreenFlashWindow(mWindow);
+        ScreenFlashUiControl uiControl = mPreviewView.getScreenFlashUiControl();
+        if (assumeNoFailure) {
+            Assume.assumeTrue("Failed to create ScreenFlashUiControl", uiControl != null);
+        }
+        return uiControl;
+    }
 }
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/ScreenFlashViewTest.kt b/camera/camera-view/src/test/java/androidx/camera/view/ScreenFlashViewTest.kt
new file mode 100644
index 0000000..8cdf155
--- /dev/null
+++ b/camera/camera-view/src/test/java/androidx/camera/view/ScreenFlashViewTest.kt
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.os.Build
+import android.view.Window
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.ImageCapture.ScreenFlashUiCompleter
+import androidx.camera.core.ImageCapture.ScreenFlashUiControl
+import androidx.test.core.app.ApplicationProvider
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert
+import org.junit.Assume
+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 org.robolectric.shadows.ShadowWindow
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class ScreenFlashViewTest {
+    private val noOpUiCompleter = ScreenFlashUiCompleter {}
+
+    private val appContext = ApplicationProvider.getApplicationContext<Context>()
+    private lateinit var screenFlashView: ScreenFlashView
+    private lateinit var window: Window
+
+    @Before
+    fun setUp() {
+        screenFlashView = ScreenFlashView(appContext)
+        createWindow()
+    }
+
+    private fun createWindow() {
+        try {
+            window = ShadowWindow.create(appContext)
+        } catch (e: ClassNotFoundException) {
+            Assume.assumeTrue("Failed to create shadow window", false)
+        }
+    }
+
+    private fun getScreenFlashUiControlAfterSettingWindow(
+        assumeNoFailure: Boolean
+    ): ScreenFlashUiControl? {
+        screenFlashView.setScreenFlashWindow(window)
+        val uiControl = screenFlashView.screenFlashUiControl
+        if (assumeNoFailure) {
+            Assume.assumeTrue("Failed to create ScreenFlashUiControl", uiControl != null)
+        }
+        return uiControl
+    }
+
+    @Test
+    fun isTransparentByDefault() {
+        assertThat(screenFlashView.alpha).isEqualTo(0f)
+    }
+
+    @Test
+    fun canProvideValidScreenFlashUiControl() {
+        val uiControl = getScreenFlashUiControlAfterSettingWindow(false)
+        assertThat(uiControl).isNotNull()
+    }
+
+    @Test
+    fun providesSameScreenFlashUiControlIfSameWindowSetAgain() {
+        val prevUiControl = getScreenFlashUiControlAfterSettingWindow(false)
+        val newUiControl = getScreenFlashUiControlAfterSettingWindow(false)
+        assertThat(newUiControl).isEqualTo(prevUiControl)
+    }
+
+    @Test
+    fun providesNewScreenFlashUiControlIfNewWindowSet() {
+        val prevUiControl = getScreenFlashUiControlAfterSettingWindow(false)
+        createWindow()
+        val newUiControl = getScreenFlashUiControlAfterSettingWindow(false)
+        assertThat(newUiControl).isNotEqualTo(prevUiControl)
+    }
+
+    @Test
+    fun isFullyVisible_whenApplyScreenFlashUiInvoked() {
+        val uiControl = getScreenFlashUiControlAfterSettingWindow(true)
+        uiControl!!.applyScreenFlashUi(noOpUiCompleter)
+        assertThat(screenFlashView.alpha).isEqualTo(1f)
+    }
+
+    @Test
+    fun windowBrightnessMaximized_whenApplyScreenFlashUiInvoked() {
+        val uiControl = getScreenFlashUiControlAfterSettingWindow(true)
+        uiControl!!.applyScreenFlashUi(noOpUiCompleter)
+        assertThat(window.attributes.screenBrightness).isEqualTo(1f)
+    }
+
+    @Test
+    fun isTransparent_whenScreenFlashUiClearedAfterApply() {
+        val uiControl = getScreenFlashUiControlAfterSettingWindow(true)
+        uiControl!!.applyScreenFlashUi(noOpUiCompleter)
+        uiControl.clearScreenFlashUi()
+        assertThat(screenFlashView.alpha).isEqualTo(0f)
+    }
+
+    @Test
+    fun windowBrightnessRestored_whenScreenFlashUiClearedAfterApply() {
+        val initialBrightness = 0.5f
+        val layoutParam = window.attributes
+        layoutParam.screenBrightness = initialBrightness
+        window.setAttributes(layoutParam)
+        val uiControl = getScreenFlashUiControlAfterSettingWindow(true)
+        uiControl!!.applyScreenFlashUi(noOpUiCompleter)
+        uiControl.clearScreenFlashUi()
+        assertThat(window.attributes.screenBrightness).isEqualTo(initialBrightness)
+    }
+
+    @Test
+    fun validScreenFlashUiControlSetToCameraController_whenWindowSetAndThenControllerSet() {
+        val cameraController = LifecycleCameraController(appContext)
+
+        screenFlashView.setScreenFlashWindow(window)
+        screenFlashView.setController(cameraController)
+
+        assertThat(cameraController.screenFlashUiInfoByPriority?.screenFlashUiControl).isNotNull()
+    }
+
+    @Test
+    fun validScreenFlashUiControlSetToCameraController_whenControllerSetAndThenWindowSet() {
+        val cameraController = LifecycleCameraController(appContext)
+
+        screenFlashView.setController(cameraController)
+        screenFlashView.setScreenFlashWindow(window)
+
+        assertThat(cameraController.screenFlashUiInfoByPriority?.screenFlashUiControl).isNotNull()
+    }
+
+    @Test
+    fun nullScreenFlashUiControlSetToCameraController_whenControllerSetButNoWindowSet() {
+        val cameraController = LifecycleCameraController(appContext)
+
+        screenFlashView.setController(cameraController)
+
+        assertThat(cameraController.screenFlashUiInfoByPriority?.screenFlashUiControl).isNull()
+    }
+
+    @Test
+    fun throwException_whenControllerSetWithScreenFlashModeButNoWindowSet() {
+        val cameraController = LifecycleCameraController(appContext)
+        cameraController.cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
+        cameraController.imageCaptureFlashMode = ImageCapture.FLASH_MODE_SCREEN
+
+        Assert.assertThrows(IllegalStateException::class.java) {
+            screenFlashView.setController(cameraController)
+        }
+    }
+}
diff --git a/camera/camera-viewfinder/api/api_lint.ignore b/camera/camera-viewfinder/api/api_lint.ignore
new file mode 100644
index 0000000..9f469e4
--- /dev/null
+++ b/camera/camera-viewfinder/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+NotCloseable: androidx.camera.viewfinder.ViewfinderSurfaceRequest:
+    Classes that release resources (finalize()) should implement AutoCloseable and CloseGuard: class androidx.camera.viewfinder.ViewfinderSurfaceRequest
diff --git a/camera/integration-tests/coretestapp/build.gradle b/camera/integration-tests/coretestapp/build.gradle
index 410eb09..fef8eda 100644
--- a/camera/integration-tests/coretestapp/build.gradle
+++ b/camera/integration-tests/coretestapp/build.gradle
@@ -63,6 +63,7 @@
     implementation(project(":camera:camera-core"))
     implementation(project(":camera:camera-lifecycle"))
     implementation(project(":camera:camera-mlkit-vision"))
+    implementation(project(":camera:camera-view"))
     implementation(project(":camera:camera-video"))
     // Needed because AGP enforces same version between main and androidTest classpaths
     implementation(project(":concurrent:concurrent-futures"))
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt
index e786bc6..ef15d27 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt
@@ -79,6 +79,7 @@
 import androidx.camera.testing.impl.WakelockEmptyActivityRule
 import androidx.camera.testing.impl.fakes.FakeLifecycleOwner
 import androidx.camera.testing.impl.fakes.FakeSessionProcessor
+import androidx.camera.testing.impl.mocks.MockScreenFlashUiControl
 import androidx.camera.video.Recorder
 import androidx.camera.video.VideoCapture
 import androidx.core.content.ContextCompat
@@ -118,6 +119,7 @@
 private val FRONT_SELECTOR = CameraSelector.DEFAULT_FRONT_CAMERA
 private const val BACK_LENS_FACING = CameraSelector.LENS_FACING_BACK
 private const val CAPTURE_TIMEOUT = 15_000.toLong() //  15 seconds
+private const val TOLERANCE = 1e-3f
 
 @LargeTest
 @RunWith(Parameterized::class)
@@ -289,6 +291,33 @@
         )
     }
 
+    @Test
+    fun canCaptureImageWithFlashModeScreen_frontCamera() {
+        // Front camera usually doesn't have a flash unit. Screen flash will be used in such case.
+        // Otherwise, physical flash will be used. But capture should be successful either way.
+        canTakeImages(
+            defaultBuilder.apply {
+                setScreenFlashUiControl(MockScreenFlashUiControl())
+                setFlashMode(ImageCapture.FLASH_MODE_SCREEN)
+            },
+            cameraSelector = FRONT_SELECTOR
+        )
+    }
+
+    @Test
+    fun canCaptureImageWithFlashModeScreenAndUseTorch_frontCamera() {
+        // Front camera usually doesn't have a flash unit. Screen flash will be used in such case.
+        // Otherwise, physical flash will be used as torch. Either way, capture should be successful
+        canTakeImages(
+            defaultBuilder.apply {
+                setFlashType(ImageCapture.FLASH_TYPE_USE_TORCH_AS_FLASH)
+                setScreenFlashUiControl(MockScreenFlashUiControl())
+                setFlashMode(ImageCapture.FLASH_MODE_SCREEN)
+            },
+            cameraSelector = FRONT_SELECTOR
+        )
+    }
+
     private fun canTakeImages(
         builder: ImageCapture.Builder,
         cameraSelector: CameraSelector = BACK_SELECTOR,
@@ -971,7 +1000,8 @@
             Rational(cropRect!!.width(), cropRect.height())
         }
 
-        assertThat(resultCroppingRatio).isEqualTo(expectedCroppingRatio)
+        assertThat(resultCroppingRatio.toFloat()).isWithin(TOLERANCE)
+            .of(expectedCroppingRatio.toFloat())
         if (imageProperties.format == ImageFormat.JPEG && isRotationOptionSupportedDevice()) {
             assertThat(imageProperties.rotationDegrees).isEqualTo(imageProperties.exif!!.rotation)
         }
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 70c637a..ea2ce51 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -24,6 +24,7 @@
 import static androidx.camera.core.ImageCapture.FLASH_MODE_AUTO;
 import static androidx.camera.core.ImageCapture.FLASH_MODE_OFF;
 import static androidx.camera.core.ImageCapture.FLASH_MODE_ON;
+import static androidx.camera.core.ImageCapture.FLASH_MODE_SCREEN;
 import static androidx.camera.core.MirrorMode.MIRROR_MODE_ON_FRONT_ONLY;
 import static androidx.camera.testing.impl.FileUtil.canDeviceWriteToMediaStore;
 import static androidx.camera.testing.impl.FileUtil.createFolder;
@@ -135,6 +136,7 @@
 import androidx.camera.video.VideoCapabilities;
 import androidx.camera.video.VideoCapture;
 import androidx.camera.video.VideoRecordEvent;
+import androidx.camera.view.ScreenFlashView;
 import androidx.core.content.ContextCompat;
 import androidx.core.math.MathUtils;
 import androidx.core.util.Consumer;
@@ -316,6 +318,7 @@
     private Button mTakePicture;
     private ImageButton mCameraDirectionButton;
     private ImageButton mFlashButton;
+    private ScreenFlashView mScreenFlashView;
     private TextView mTextView;
     private ImageButton mTorchButton;
     private ToggleButton mCaptureQualityToggle;
@@ -589,17 +592,36 @@
     private void setUpFlashButton() {
         mFlashButton.setOnClickListener(v -> {
             @ImageCapture.FlashMode int flashMode = getImageCapture().getFlashMode();
-            if (flashMode == FLASH_MODE_ON) {
-                getImageCapture().setFlashMode(FLASH_MODE_OFF);
-            } else if (flashMode == FLASH_MODE_OFF) {
-                getImageCapture().setFlashMode(FLASH_MODE_AUTO);
+
+            if (flashMode == FLASH_MODE_OFF) {
+                if (isFlashAvailable()) {
+                    getImageCapture().setFlashMode(FLASH_MODE_AUTO);
+                } else {
+                    setUpScreenFlash();
+                }
             } else if (flashMode == FLASH_MODE_AUTO) {
                 getImageCapture().setFlashMode(FLASH_MODE_ON);
+            } else if (flashMode == FLASH_MODE_ON) {
+                if (getLensFacing(Objects.requireNonNull(getCameraInfo()))
+                        != CameraSelector.LENS_FACING_FRONT) {
+                    getImageCapture().setFlashMode(FLASH_MODE_OFF);
+                } else {
+                    setUpScreenFlash();
+                }
+            } else if (flashMode == FLASH_MODE_SCREEN) {
+                getImageCapture().setFlashMode(FLASH_MODE_OFF);
             }
             updateButtonsUi();
         });
     }
 
+    private void setUpScreenFlash() {
+        mScreenFlashView.setScreenFlashWindow(getWindow());
+        getImageCapture().setScreenFlashUiControl(
+                mScreenFlashView.getScreenFlashUiControl());
+        getImageCapture().setFlashMode(FLASH_MODE_SCREEN);
+    }
+
     @SuppressLint({"MissingPermission", "NullAnnotationGroup"})
     @OptIn(markerClass = ExperimentalPersistentRecording.class)
     private void setUpRecordButton() {
@@ -1156,7 +1178,7 @@
                 && Preview.getPreviewCapabilities(getCameraInfo()).isStabilizationSupported());
         mTorchButton.setEnabled(isFlashAvailable());
         // Flash button
-        mFlashButton.setEnabled(mPhotoToggle.isChecked() && isFlashAvailable());
+        mFlashButton.setEnabled(mPhotoToggle.isChecked());
         if (mPhotoToggle.isChecked()) {
             int flashMode = getImageCapture().getFlashMode();
             if (isFlashTestSupported(flashMode)) {
@@ -1176,6 +1198,9 @@
                 case FLASH_MODE_AUTO:
                     mFlashButton.setImageResource(R.drawable.ic_flash_auto);
                     break;
+                case FLASH_MODE_SCREEN:
+                    mFlashButton.setImageResource(R.drawable.ic_flash_screen);
+                    break;
             }
         }
         mPlusEV.setEnabled(isExposureCompensationSupported());
@@ -1291,6 +1316,7 @@
 
         mTakePicture = findViewById(R.id.Picture);
         mFlashButton = findViewById(R.id.flash_toggle);
+        mScreenFlashView = findViewById(R.id.screen_flash_view);
         mCameraDirectionButton = findViewById(R.id.direction_toggle);
         mTorchButton = findViewById(R.id.torch_toggle);
         mCaptureQualityToggle = findViewById(R.id.capture_quality);
diff --git a/camera/integration-tests/coretestapp/src/main/res/drawable/ic_flash_screen.xml b/camera/integration-tests/coretestapp/src/main/res/drawable/ic_flash_screen.xml
new file mode 100644
index 0000000..6a101bd
--- /dev/null
+++ b/camera/integration-tests/coretestapp/src/main/res/drawable/ic_flash_screen.xml
@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1.01 17,1.01zM17,18H7V6h10V18zM9.5,8.5H12V7H8v4h1.5V8.5zM12,17h4v-4h-1.5v2.5H12V17z"/>
+</vector>
diff --git a/camera/integration-tests/coretestapp/src/main/res/layout/activity_camera_xmain.xml b/camera/integration-tests/coretestapp/src/main/res/layout/activity_camera_xmain.xml
index 53613a2..81eb97a 100644
--- a/camera/integration-tests/coretestapp/src/main/res/layout/activity_camera_xmain.xml
+++ b/camera/integration-tests/coretestapp/src/main/res/layout/activity_camera_xmain.xml
@@ -405,4 +405,8 @@
         app:layout_constraintStart_toEndOf="@+id/seekBar"
         app:layout_constraintTop_toTopOf="@+id/seekBar" />
 
+    <androidx.camera.view.ScreenFlashView
+        android:id="@+id/screen_flash_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/Camera2ExtensionsActivity.kt b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/Camera2ExtensionsActivity.kt
index 3176287..a900ea6 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/Camera2ExtensionsActivity.kt
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/Camera2ExtensionsActivity.kt
@@ -52,6 +52,8 @@
 import android.widget.Button
 import android.widget.FrameLayout
 import android.widget.ImageButton
+import android.widget.Switch
+import android.widget.TextView
 import android.widget.Toast
 import androidx.annotation.RequiresApi
 import androidx.annotation.VisibleForTesting
@@ -92,6 +94,7 @@
 import java.util.Calendar
 import java.util.Locale
 import java.util.concurrent.Executors
+import java.util.concurrent.TimeUnit
 import java.util.concurrent.atomic.AtomicLong
 import kotlin.coroutines.resume
 import kotlin.coroutines.resumeWithException
@@ -111,6 +114,7 @@
 private const val FRAMES_UNTIL_VIEW_IS_READY = 10
 private const val KEY_CAMERA2_LATENCY = "camera2"
 private const val KEY_CAMERA_EXTENSION_LATENCY = "camera_extension"
+private const val MAX_EXTENSION_LATENCY_MILLIS = 800
 
 @RequiresApi(31)
 class Camera2ExtensionsActivity : AppCompatActivity() {
@@ -176,6 +180,8 @@
     private lateinit var containerView: View
 
     private lateinit var textureView: TextureView
+    private lateinit var videoStabilizationToggleView: Switch
+    private lateinit var videoStabilizationModeView: TextView
 
     private var previewSurface: Surface? = null
 
@@ -208,6 +214,20 @@
             ) {
                 previewIdlingResource.decrement()
             }
+
+            if (measureStreamConfigurationLatency && lastSurfaceTextureTimestampNanos != 0L) {
+                val duration = TimeUnit.NANOSECONDS.toMillis(
+                    surfaceTexture.timestamp - lastSurfaceTextureTimestampNanos)
+                if (duration > 150) {
+                    if (cameraCaptureSession is CameraCaptureSession) {
+                        streamConfigurationLatency[KEY_CAMERA2_LATENCY]?.add(duration)
+                    } else if (cameraCaptureSession is CameraExtensionSession) {
+                        streamConfigurationLatency[KEY_CAMERA_EXTENSION_LATENCY]?.add(duration)
+                    }
+                    measureStreamConfigurationLatency = false
+                }
+            }
+            lastSurfaceTextureTimestampNanos = surfaceTexture.timestamp
         }
     }
 
@@ -252,10 +272,17 @@
     private var imageSaveTerminationFuture: ListenableFuture<Any?> = Futures.immediateFuture(null)
 
     /**
-     * Tracks the starting timestamp of when a stream configuration operation started. This is used
-     * to measure the stream configuration latency from openCaptureSession to onConfigured.
+     * Tracks the last timestamp of a surface texture rendered on to the TextureView. This is used
+     * to measure the configuration latency from the last preview frame received from the previous
+     * camera session until the first preview frame received of the new camera session.
      */
-    private var streamConfigurationStartMillis: Long = 0
+    private var lastSurfaceTextureTimestampNanos: Long = 0
+
+    /**
+     * A flag which represents when to measure the stream configuration latency. This is triggered
+     * when the user toggles the camera extension mode.
+     */
+    private var measureStreamConfigurationLatency: Boolean = true
 
     /**
      * Used to wait for the capture session is configured.
@@ -366,6 +393,7 @@
         setupTextureView()
         enableUiControl(false)
         setupUiControl()
+        setupVideoStabilizationModeView()
     }
 
     private fun setupForRequestMode() {
@@ -396,6 +424,7 @@
         findViewById<ImageButton>(R.id.ExtensionToggle).apply {
             visibility = View.VISIBLE
             setOnClickListener {
+                measureStreamConfigurationLatency = true
                 val cameraId = currentCameraId
                 val extensionMode = currentExtensionMode
                 restartPreview = true
@@ -511,6 +540,38 @@
         textureView.surfaceTextureListener = surfaceTextureListener
     }
 
+    private fun setupVideoStabilizationModeView() {
+        videoStabilizationToggleView = findViewById(R.id.videoStabilizationToggle)
+        videoStabilizationModeView = findViewById(R.id.videoStabilizationMode)
+
+        val availableModes = cameraManager.getCameraCharacteristics(currentCameraId)
+            .get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES) ?: intArrayOf()
+
+        if (availableModes
+                .contains(CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION)
+        ) {
+            videoStabilizationToggleView.visibility = View.VISIBLE
+            videoStabilizationModeView.visibility = View.VISIBLE
+
+            videoStabilizationToggleView.setOnCheckedChangeListener { _, isChecked ->
+                val device = cameraDevice ?: return@setOnCheckedChangeListener
+                val session = cameraCaptureSession ?: return@setOnCheckedChangeListener
+
+                val mode = if (isChecked) "Preview" else "Off"
+                videoStabilizationModeView.text = "Video Stabilization Mode: $mode"
+
+                lifecycleScope.launch {
+                    suspendCancellableCoroutine<Any> { cont ->
+                        setRepeatingRequestWhenCaptureSessionConfigured(cont, device, session)
+                    }
+                }
+            }
+        } else {
+            videoStabilizationToggleView.visibility = View.GONE
+            videoStabilizationModeView.visibility = View.GONE
+        }
+    }
+
     private fun enableUiControl(enabled: Boolean) {
         findViewById<Button>(R.id.PhotoToggle).isEnabled = enabled
         findViewById<Button>(R.id.Switch).isEnabled = enabled
@@ -578,6 +639,7 @@
             closeCaptureSessionAsync().await()
             closeCameraAsync().await()
         }
+        lastSurfaceTextureTimestampNanos = 0L
         restartOnStart = true
         activityStopped = true
         Log.d(TAG, "onStop()--")
@@ -613,7 +675,7 @@
 
         val durations = streamConfigurationLatency[KEY_CAMERA_EXTENSION_LATENCY] ?: emptyList()
         val testResult = if (durations.isNotEmpty()) {
-            if (durations.average() > 300.0) {
+            if (durations.average() > MAX_EXTENSION_LATENCY_MILLIS) {
                 TEST_RESULT_FAILED
             } else {
                 TEST_RESULT_PASSED
@@ -796,8 +858,6 @@
     private suspend fun openCaptureSession(extensionMode: Int): Any =
         suspendCancellableCoroutine { cont ->
             Log.d(TAG, "openCaptureSession")
-            streamConfigurationStartMillis = System.currentTimeMillis()
-
             if (stillImageReader != null) {
                 val imageReaderToClose = stillImageReader!!
                 imageSaveTerminationFuture.addListener(
@@ -843,9 +903,6 @@
 
                 override fun onConfigured(session: CameraCaptureSession) {
                     Log.d(TAG, "CaptureSession - onConfigured: $session")
-                    val duration = System.currentTimeMillis() - streamConfigurationStartMillis
-                    streamConfigurationLatency[KEY_CAMERA2_LATENCY]?.add(duration)
-                    streamConfigurationStartMillis = 0
                     setRepeatingRequestWhenCaptureSessionConfigured(cont, session.device, session)
                     lifecycleScope.launch(Dispatchers.Main) {
                         enableUiControl(true)
@@ -857,7 +914,6 @@
 
                 override fun onConfigureFailed(session: CameraCaptureSession) {
                     Log.e(TAG, "CaptureSession - onConfigureFailed: $session")
-                    streamConfigurationStartMillis = 0
                     cont.resumeWithException(
                         RuntimeException("Configure failed when creating capture session.")
                     )
@@ -889,9 +945,6 @@
 
                 override fun onConfigured(session: CameraExtensionSession) {
                     Log.d(TAG, "Extension CaptureSession - onConfigured: $session")
-                    val duration = System.currentTimeMillis() - streamConfigurationStartMillis
-                    streamConfigurationLatency[KEY_CAMERA_EXTENSION_LATENCY]?.add(duration)
-                    streamConfigurationStartMillis = 0
                     setRepeatingRequestWhenCaptureSessionConfigured(cont, session.device, session)
                     runOnUiThread {
                         enableUiControl(true)
@@ -903,7 +956,6 @@
 
                 override fun onConfigureFailed(session: CameraExtensionSession) {
                     Log.e(TAG, "Extension CaptureSession - onConfigureFailed: $session")
-                    streamConfigurationStartMillis = 0
                     cont.resumeWithException(
                         RuntimeException("Configure failed when creating capture session.")
                     )
@@ -934,11 +986,15 @@
         try {
             val captureBuilder = device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
             captureBuilder.addTarget(previewSurface!!)
-            // Some devices enable video stabilization mode by default. For consistent behavior we
-            // explicitly disable this.
+            val videoStabilizationMode = if (videoStabilizationToggleView.isChecked) {
+                CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION
+            } else {
+                CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_OFF
+            }
+
             captureBuilder.set(
                 CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
-                CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_OFF
+                videoStabilizationMode
             )
 
             if (captureSession is CameraCaptureSession) {
diff --git a/camera/integration-tests/extensionstestapp/src/main/res/drawable/bg_pill.xml b/camera/integration-tests/extensionstestapp/src/main/res/drawable/bg_pill.xml
new file mode 100644
index 0000000..764f728
--- /dev/null
+++ b/camera/integration-tests/extensionstestapp/src/main/res/drawable/bg_pill.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="8dp" />
+    <solid android:color="#B0FFFFFF" />
+</shape>
\ No newline at end of file
diff --git a/camera/integration-tests/extensionstestapp/src/main/res/layout/activity_camera_extensions.xml b/camera/integration-tests/extensionstestapp/src/main/res/layout/activity_camera_extensions.xml
index 4fd7a30..37ab89e 100644
--- a/camera/integration-tests/extensionstestapp/src/main/res/layout/activity_camera_extensions.xml
+++ b/camera/integration-tests/extensionstestapp/src/main/res/layout/activity_camera_extensions.xml
@@ -97,6 +97,29 @@
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
+    <Switch
+        android:id="@+id/videoStabilizationToggle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="16dp"
+        android:visibility="gone"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        />
+
+    <TextView
+        android:id="@+id/videoStabilizationMode"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="16dp"
+        android:text="Video Stabilization Mode: Off"
+        android:visibility="gone"
+        android:padding="8dp"
+        android:background="@drawable/bg_pill"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/videoStabilizationToggle"
+        />
+
     <TextView
         android:id="@+id/frameInfo"
         android:layout_width="wrap_content"
diff --git a/camera/integration-tests/viewtestapp/lint-baseline.xml b/camera/integration-tests/viewtestapp/lint-baseline.xml
index cfacbf5..6168e19 100644
--- a/camera/integration-tests/viewtestapp/lint-baseline.xml
+++ b/camera/integration-tests/viewtestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-beta01" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-beta01)" variant="all" version="8.2.0-beta01">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="RestrictedApiAndroidX"
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 1aabfee8..1f2a77f 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
@@ -75,6 +75,7 @@
 import androidx.camera.view.video.AudioConfig;
 import androidx.core.util.Consumer;
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
 import androidx.lifecycle.LiveData;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -198,6 +199,7 @@
         // Use compatible mode so StreamState is accurate.
         mPreviewView.setImplementationMode(PreviewView.ImplementationMode.COMPATIBLE);
         mPreviewView.setController(mCameraController);
+        mPreviewView.setScreenFlashWindow(requireActivity().getWindow());
 
         // Set up the button to add and remove the PreviewView
         mContainer = view.findViewById(R.id.container);
@@ -220,9 +222,17 @@
         mCameraToggle = view.findViewById(R.id.camera_toggle);
         mCameraToggle.setOnCheckedChangeListener(
                 (compoundButton, value) ->
-                        runSafely(() -> mCameraController.setCameraSelector(value
-                                ? CameraSelector.DEFAULT_BACK_CAMERA
-                                : CameraSelector.DEFAULT_FRONT_CAMERA)));
+                        runSafely(() -> {
+                            if (value) {
+                                mCameraController.setImageCaptureFlashMode(
+                                        ImageCapture.FLASH_MODE_OFF);
+                                updateUiText();
+                            }
+
+                            mCameraController.setCameraSelector(value
+                                    ? CameraSelector.DEFAULT_BACK_CAMERA
+                                    : CameraSelector.DEFAULT_FRONT_CAMERA);
+                        }));
 
         // Image Capture enable switch.
         mCaptureEnabledToggle = view.findViewById(R.id.capture_enabled);
@@ -237,6 +247,13 @@
                     mCameraController.setImageCaptureFlashMode(ImageCapture.FLASH_MODE_ON);
                     break;
                 case ImageCapture.FLASH_MODE_ON:
+                    if (!mCameraToggle.isChecked()) {
+                        mCameraController.setImageCaptureFlashMode(ImageCapture.FLASH_MODE_SCREEN);
+                    } else {
+                        mCameraController.setImageCaptureFlashMode(ImageCapture.FLASH_MODE_OFF);
+                    }
+                    break;
+                case ImageCapture.FLASH_MODE_SCREEN:
                     mCameraController.setImageCaptureFlashMode(ImageCapture.FLASH_MODE_OFF);
                     break;
                 case ImageCapture.FLASH_MODE_OFF:
@@ -371,8 +388,15 @@
     // Synthetic access
     @SuppressWarnings("WeakerAccess")
     void toast(String message) {
-        requireActivity().runOnUiThread(
-                () -> Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show());
+        FragmentActivity activity = getActivity();
+        if (activity != null) {
+            activity.runOnUiThread(() -> {
+                if (isAdded()) {
+                    Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
+                }
+            });
+        }
+        Log.d(TAG, message);
     }
 
     private void updateZoomStateText(@Nullable ZoomState zoomState) {
@@ -444,6 +468,8 @@
                 return R.string.flash_mode_auto;
             case ImageCapture.FLASH_MODE_ON:
                 return R.string.flash_mode_on;
+            case ImageCapture.FLASH_MODE_SCREEN:
+                return R.string.flash_mode_screen;
             case ImageCapture.FLASH_MODE_OFF:
                 return R.string.flash_mode_off;
             default:
diff --git a/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml b/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml
index cae3f3f..e57b93f 100644
--- a/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml
+++ b/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml
@@ -60,6 +60,7 @@
     <string name="compose_ui">Compose UI</string>
     <string name="flash_mode_auto">flash auto</string>
     <string name="flash_mode_on">flash on</string>
+    <string name="flash_mode_screen">screen flash</string>
     <string name="flash_mode_off">flash off</string>
     <string name="mirror_on">mirror on</string>
     <string name="mirror_off">mirror off</string>
diff --git a/car/app/app/src/main/java/androidx/car/app/media/MediaPlaybackManager.java b/car/app/app/src/main/java/androidx/car/app/media/MediaPlaybackManager.java
index 8a1da03..12f16d1 100644
--- a/car/app/app/src/main/java/androidx/car/app/media/MediaPlaybackManager.java
+++ b/car/app/app/src/main/java/androidx/car/app/media/MediaPlaybackManager.java
@@ -29,7 +29,6 @@
 import androidx.annotation.RestrictTo;
 import androidx.car.app.CarContext;
 import androidx.car.app.HostDispatcher;
-import androidx.car.app.HostException;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.managers.Manager;
 import androidx.car.app.serialization.Bundleable;
@@ -54,8 +53,6 @@
      * allow the host to read the media session playback state.
      *
      * @param token to be sent to the host
-     * @throws HostException            if the call is invoked by an app that is not declared as
-     *                                  a navigation app in the manifest
      * @throws IllegalArgumentException if any of the token cannot be serialized
      * @throws IllegalStateException    if this is not called from the main thread.
      */
diff --git a/cardview/cardview/lint-baseline.xml b/cardview/cardview/lint-baseline.xml
index bc26e05..dbd37d1 100644
--- a/cardview/cardview/lint-baseline.xml
+++ b/cardview/cardview/lint-baseline.xml
@@ -1,13 +1,31 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Class requires API level 21 (current min is 14): `CardViewApi21Impl`"
+        message="Class requires API level 21 (current min is 19): `CardViewApi21Impl`"
         errorLine1="        if (!(IMPL instanceof CardViewApi21Impl)) {"
         errorLine2="                              ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/cardview/widget/CardView.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/cardview/widget/CardView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/cardview/widget/CardViewApi17Impl.java"/>
+    </issue>
+
 </issues>
diff --git a/collection/collection/api/current.txt b/collection/collection/api/current.txt
index 0d3d191..66c91fb 100644
--- a/collection/collection/api/current.txt
+++ b/collection/collection/api/current.txt
@@ -24,9 +24,9 @@
   }
 
   public final class ArraySet<E> implements java.util.Collection<E> kotlin.jvm.internal.markers.KMutableCollection kotlin.jvm.internal.markers.KMutableSet java.util.Set<E> {
-    ctor public ArraySet();
     ctor public ArraySet(androidx.collection.ArraySet<? extends E>? set);
     ctor public ArraySet(E![]? array);
+    ctor public ArraySet();
     ctor public ArraySet(optional int capacity);
     ctor public ArraySet(java.util.Collection<? extends E>? set);
     method public boolean add(E element);
diff --git a/collection/collection/api/restricted_current.txt b/collection/collection/api/restricted_current.txt
index 6595887..2bbe99a 100644
--- a/collection/collection/api/restricted_current.txt
+++ b/collection/collection/api/restricted_current.txt
@@ -24,9 +24,9 @@
   }
 
   public final class ArraySet<E> implements java.util.Collection<E> kotlin.jvm.internal.markers.KMutableCollection kotlin.jvm.internal.markers.KMutableSet java.util.Set<E> {
-    ctor public ArraySet();
     ctor public ArraySet(androidx.collection.ArraySet<? extends E>? set);
     ctor public ArraySet(E![]? array);
+    ctor public ArraySet();
     ctor public ArraySet(optional int capacity);
     ctor public ArraySet(java.util.Collection<? extends E>? set);
     method public boolean add(E element);
diff --git a/collection/collection/src/commonMain/kotlin/androidx/collection/LongSparseArray.kt b/collection/collection/src/commonMain/kotlin/androidx/collection/LongSparseArray.kt
index 83ab1d1..e891076 100644
--- a/collection/collection/src/commonMain/kotlin/androidx/collection/LongSparseArray.kt
+++ b/collection/collection/src/commonMain/kotlin/androidx/collection/LongSparseArray.kt
@@ -20,6 +20,7 @@
 import androidx.collection.internal.idealLongArraySize
 import kotlin.DeprecationLevel.HIDDEN
 import kotlin.jvm.JvmField
+import kotlin.jvm.JvmOverloads
 import kotlin.jvm.JvmSynthetic
 
 private val DELETED = Any()
@@ -53,7 +54,7 @@
  * requiring any additional array allocations.
  */
 public expect open class LongSparseArray<E>
-public constructor(initialCapacity: Int = 10) {
+@JvmOverloads public constructor(initialCapacity: Int = 10) {
     @JvmSynthetic // Hide from Java callers.
     @JvmField
     internal var garbage: Boolean
diff --git a/collection/collection/src/commonMain/kotlin/androidx/collection/SparseArrayCompat.kt b/collection/collection/src/commonMain/kotlin/androidx/collection/SparseArrayCompat.kt
index 817f261..118d992 100644
--- a/collection/collection/src/commonMain/kotlin/androidx/collection/SparseArrayCompat.kt
+++ b/collection/collection/src/commonMain/kotlin/androidx/collection/SparseArrayCompat.kt
@@ -19,6 +19,7 @@
 import androidx.collection.internal.binarySearch
 import androidx.collection.internal.idealIntArraySize
 import kotlin.jvm.JvmField
+import kotlin.jvm.JvmOverloads
 import kotlin.jvm.JvmSynthetic
 import kotlin.math.min
 
@@ -61,7 +62,8 @@
  * 0, the sparse array will be initialized with a light-weight representation not requiring any
  * additional array allocations. Default initialCapacity is 10.
  */
-public expect open class SparseArrayCompat<E> public constructor(
+public expect open class SparseArrayCompat<E>
+@JvmOverloads public constructor(
     initialCapacity: Int = 10
 ) {
     @JvmSynthetic // Hide from Java callers.
diff --git a/collection/collection/src/jvmMain/kotlin/androidx/collection/ArraySet.jvm.kt b/collection/collection/src/jvmMain/kotlin/androidx/collection/ArraySet.jvm.kt
index e804ff1..207bc5d 100644
--- a/collection/collection/src/jvmMain/kotlin/androidx/collection/ArraySet.jvm.kt
+++ b/collection/collection/src/jvmMain/kotlin/androidx/collection/ArraySet.jvm.kt
@@ -44,12 +44,9 @@
  * will grow once items are added to it.
  */
 public actual class ArraySet<E>
-// TODO(b/237405792): Default value for optional argument is required here to workaround Metalava's
-//  lack of support for expect / actual.
-@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
-// TODO(b/237405286): @JvmOverloads is redundant in this actual, but is necessary here to workaround
-//  Metalava's lack of support for expect / actual.
-@JvmOverloads actual constructor(capacity: Int = 0) : MutableCollection<E>, MutableSet<E> {
+@JvmOverloads actual constructor(
+    capacity: Int
+) : MutableCollection<E>, MutableSet<E> {
     internal actual var hashes: IntArray = EMPTY_INTS
     internal actual var array: Array<Any?> = EMPTY_OBJECTS
 
diff --git a/collection/collection/src/jvmMain/kotlin/androidx/collection/LongSparseArray.jvm.kt b/collection/collection/src/jvmMain/kotlin/androidx/collection/LongSparseArray.jvm.kt
index 4b8c9d6..7c5d274 100644
--- a/collection/collection/src/jvmMain/kotlin/androidx/collection/LongSparseArray.jvm.kt
+++ b/collection/collection/src/jvmMain/kotlin/androidx/collection/LongSparseArray.jvm.kt
@@ -49,11 +49,9 @@
  * requiring any additional array allocations.
  */
 public actual open class LongSparseArray<E>
-
-// TODO(b/237405792): Default value for optional argument is required here to workaround Metalava's
-//  lack of support for expect / actual.
-@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
-@JvmOverloads public actual constructor(initialCapacity: Int = 10) : Cloneable {
+@JvmOverloads public actual constructor(
+    initialCapacity: Int
+) : Cloneable {
     @JvmSynthetic // Hide from Java callers.
     @JvmField
     internal actual var garbage = false
diff --git a/collection/collection/src/jvmMain/kotlin/androidx/collection/SparseArrayCompat.jvm.kt b/collection/collection/src/jvmMain/kotlin/androidx/collection/SparseArrayCompat.jvm.kt
index 848a851..2bb438c 100644
--- a/collection/collection/src/jvmMain/kotlin/androidx/collection/SparseArrayCompat.jvm.kt
+++ b/collection/collection/src/jvmMain/kotlin/androidx/collection/SparseArrayCompat.jvm.kt
@@ -58,13 +58,8 @@
  * additional array allocations. Default initialCapacity is 10.
  */
 public actual open class SparseArrayCompat<E>
-// TODO(b/237405792): Default value for optional argument is required here to workaround Metalava's
-//  lack of support for expect / actual.
-@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
-// TODO(b/237405286): @JvmOverloads is redundant in this actual, but is necessary here to workaround
-//  Metalava's lack of support for expect / actual.
 @JvmOverloads public actual constructor(
-    initialCapacity: Int = 10
+    initialCapacity: Int
 ) : Cloneable {
     @JvmSynthetic // Hide from Java callers.
     @JvmField
diff --git a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/KeyframesSpecWithSplineBenchmark.kt b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/KeyframesSpecWithSplineBenchmark.kt
index dbd3d18..1cf16dd 100644
--- a/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/KeyframesSpecWithSplineBenchmark.kt
+++ b/compose/animation/animation-core/benchmark/src/androidTest/java/androidx/compose/animation/core/benchmark/KeyframesSpecWithSplineBenchmark.kt
@@ -92,14 +92,16 @@
 
         // Cal the first frame before measuring, to guarantee the spline interpolation is built
         vectorized.getValueFromNanos(
-            playTimeNanos = 0L,
+            // Avoid using a number that may match one of the given timestamps, it will prevent the
+            // MonoSpline from initializing, an irrational number factor should work well
+            playTimeNanos = playTimeNanosToEvaluate * 2 / 3L,
             initialValue = initialVector,
             targetValue = targetVector,
             initialVelocity = initialVector
         )
 
         val frame0 = playTimeNanosToEvaluate
-        val frame1 = playTimeNanosToEvaluate + (1000.0f / 60 * 1_000_000).roundToLong()
+        val frame1 = frame0 + (1000.0f / 60 * 1_000_000).roundToLong()
         benchmarkRule.measureRepeated {
             vectorized.getValueFromNanos(
                 playTimeNanos = frame0,
@@ -129,7 +131,9 @@
 
         // Cal the first frame before measuring, to guarantee the spline interpolation is built
         vectorized.getValueFromNanos(
-            playTimeNanos = 0L,
+            // Avoid using a number that may match one of the given timestamps, it will prevent the
+            // MonoSpline from initializing, an irrational number factor should work well
+            playTimeNanos = playTimeNanosToEvaluate * 2 / 3L,
             initialValue = initialVector,
             targetValue = targetVector,
             initialVelocity = initialVector
diff --git a/compose/animation/animation-core/lint-baseline.xml b/compose/animation/animation-core/lint-baseline.xml
index f02a3f7..66a0edf 100644
--- a/compose/animation/animation-core/lint-baseline.xml
+++ b/compose/animation/animation-core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-beta01" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-beta01)" variant="all" version="8.2.0-beta01">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanSuppressTag"
@@ -84,24 +84,6 @@
 
     <issue
         id="PrimitiveInCollection"
-        message="field keyframes with type Map&lt;Integer, KeyframeEntity&lt;T>>: replace with IntObjectMap"
-        errorLine1="        internal val keyframes = mutableMapOf&lt;Int, KeyframeEntity&lt;T>>()"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Map&lt;Integer, KeyframeEntity&lt;T>> of getKeyframes$lint_module: replace with IntObjectMap"
-        errorLine1="        internal val keyframes = mutableMapOf&lt;Int, KeyframeEntity&lt;T>>()"
-        errorLine2="                     ~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
         message="constructor VectorizedKeyframesSpec has parameter keyframes with type Map&lt;Integer, ? extends Pair&lt;? extends V, ? extends Easing>>: replace with IntObjectMap"
         errorLine1="    private val keyframes: Map&lt;Int, Pair&lt;V, Easing>>,"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~">
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
index 58ef19c..873b61e 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
@@ -17,6 +17,8 @@
 package androidx.compose.animation.core
 
 import androidx.annotation.IntRange
+import androidx.collection.MutableIntList
+import androidx.collection.MutableIntObjectMap
 import androidx.collection.mutableIntObjectMapOf
 import androidx.compose.animation.core.AnimationConstants.DefaultDurationMillis
 import androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig
@@ -580,15 +582,17 @@
     override fun <V : AnimationVector> vectorize(converter: TwoWayConverter<T, V>):
         VectorizedDurationBasedAnimationSpec<V> {
         // TODO(b/292114811): Finish Easing support, user input is currently ignored
-        // TODO(b/292114811): Find a way to comply and preserve insertion order
-        @SuppressWarnings("PrimitiveInCollection")
-        val vectorizedKeyframes = mutableMapOf<Int, V>()
-        config.keyframes.forEach { key, value ->
-            vectorizedKeyframes[key] = converter.convertToVector(value.value)
-        }
+        val timestamps = MutableIntList()
+        val timeToVectorMap = MutableIntObjectMap<V>()
 
+        config.keyframes.forEach { key, value ->
+            timestamps.add(key)
+            timeToVectorMap[key] = converter.convertToVector(value.value)
+        }
+        timestamps.sort()
         return VectorizedMonoSplineKeyframesSpec(
-            keyframes = vectorizedKeyframes,
+            timestamps = timestamps,
+            keyframes = timeToVectorMap,
             durationMillis = config.durationMillis,
             delayMillis = config.delayMillis
         )
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/MonoSpline.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/MonoSpline.kt
index ba75858..509023d 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/MonoSpline.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/MonoSpline.kt
@@ -183,6 +183,62 @@
     }
 
     /**
+     * Populate the values of the spline at time [t] into the given AnimationVector [v].
+     */
+    fun getPos(t: Float, v: AnimationVector) {
+        val n = timePoints.size
+        val dim = values[0].size
+        if (isExtrapolate) {
+            if (t <= timePoints[0]) {
+                getSlope(timePoints[0], slopeTemp)
+                for (j in 0 until dim) {
+                    v[j] = values[0][j] + (t - timePoints[0]) * slopeTemp[j]
+                }
+                return
+            }
+            if (t >= timePoints[n - 1]) {
+                getSlope(timePoints[n - 1], slopeTemp)
+                for (j in 0 until dim) {
+                    v[j] = values[n - 1][j] + (t - timePoints[n - 1]) * slopeTemp[j]
+                }
+                return
+            }
+        } else {
+            if (t <= timePoints[0]) {
+                for (j in 0 until dim) {
+                    v[j] = values[0][j]
+                }
+                return
+            }
+            if (t >= timePoints[n - 1]) {
+                for (j in 0 until dim) {
+                    v[j] = values[n - 1][j]
+                }
+                return
+            }
+        }
+        for (i in 0 until n - 1) {
+            if (t == timePoints[i]) {
+                for (j in 0 until dim) {
+                    v[j] = values[i][j]
+                }
+            }
+            if (t < timePoints[i + 1]) {
+                val h = timePoints[i + 1] - timePoints[i]
+                val x = (t - timePoints[i]) / h
+                for (j in 0 until dim) {
+                    val y1 = values[i][j]
+                    val y2 = values[i + 1][j]
+                    val t1 = tangents[i][j]
+                    val t2 = tangents[i + 1][j]
+                    v[j] = interpolate(h, x, y1, y2, t1, t2)
+                }
+                return
+            }
+        }
+    }
+
+    /**
      * Get the differential of the value at time
      * fill an array of slopes for each spline
      */
@@ -212,6 +268,36 @@
         return
     }
 
+    /**
+     * Populate the differential values of the spline at the given [time] in to the given
+     * AnimationVector [v].
+     */
+    fun getSlope(time: Float, v: AnimationVector) {
+        var t = time
+        val n = timePoints.size
+        val dim = values[0].size
+        if (t <= timePoints[0]) {
+            t = timePoints[0]
+        } else if (t >= timePoints[n - 1]) {
+            t = timePoints[n - 1]
+        }
+        for (i in 0 until n - 1) {
+            if (t <= timePoints[i + 1]) {
+                val h = timePoints[i + 1] - timePoints[i]
+                val x = (t - timePoints[i]) / h
+                for (j in 0 until dim) {
+                    val y1 = values[i][j]
+                    val y2 = values[i + 1][j]
+                    val t1 = tangents[i][j]
+                    val t2 = tangents[i + 1][j]
+                    v[j] = diff(h, x, y1, y2, t1, t2) / h
+                }
+                break
+            }
+        }
+        return
+    }
+
     private fun getSlope(time: Float, j: Int): Float {
         var t = time
         val n = timePoints.size
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedMonoSplineKeyframesSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedMonoSplineKeyframesSpec.kt
index 1a5c414..008fa2b 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedMonoSplineKeyframesSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/VectorizedMonoSplineKeyframesSpec.kt
@@ -16,16 +16,16 @@
 
 package androidx.compose.animation.core
 
-import androidx.compose.ui.util.fastForEachIndexed
+import androidx.collection.IntList
+import androidx.collection.IntObjectMap
 
 /**
  * Implementation of [VectorizedMonoSplineKeyframesSpec] using [MonoSpline].
  */
-// TODO(b/292114811): Find a way to comply and preserve insertion order
-@SuppressWarnings("PrimitiveInCollection")
 @ExperimentalAnimationSpecApi
 internal class VectorizedMonoSplineKeyframesSpec<V : AnimationVector>(
-    private val keyframes: Map<Int, V>,
+    private val timestamps: IntList,
+    private val keyframes: IntObjectMap<V>,
     override val durationMillis: Int,
     override val delayMillis: Int = 0
 ) : VectorizedDurationBasedAnimationSpec<V> {
@@ -35,8 +35,6 @@
     // Objects for MonoSpline
     private lateinit var lastInitialValue: V
     private lateinit var lastTargetValue: V
-    private lateinit var posArray: FloatArray
-    private lateinit var slopeArray: FloatArray
     private lateinit var monoSpline: MonoSpline
 
     private fun init(initialValue: V, targetValue: V, initialVelocity: V) {
@@ -49,8 +47,6 @@
         ) {
             lastInitialValue = initialValue
             lastTargetValue = targetValue
-            posArray = FloatArray(initialValue.size)
-            slopeArray = FloatArray(initialVelocity.size)
 
             val arraySize = keyframes.size + 2
             val times = FloatArray(arraySize)
@@ -69,14 +65,14 @@
             }
 
             // Need to set times/values arrays in the order of the timestamps
-            keyframes.entries.sortedBy { it.key }
-                .fastForEachIndexed { index, (frameMillis, valueVector) ->
-                    times[index + 1] = frameMillis.toFloat() / SecondsToMillis
-                    val vector = values[index + 1]
-                    for (i in vector.indices) {
-                        vector[i] = valueVector[i]
-                    }
+            timestamps.forEachIndexed { index, frameMillis ->
+                val valueVector = keyframes[frameMillis]!!
+                times[index + 1] = frameMillis.toFloat() / SecondsToMillis
+                val vector = values[index + 1]
+                for (i in vector.indices) {
+                    vector[i] = valueVector[i]
                 }
+            }
             monoSpline = MonoSpline(times, values)
         }
     }
@@ -102,11 +98,8 @@
 
         monoSpline.getPos(
             t = clampedPlayTime.toFloat() / SecondsToMillis,
-            v = posArray
+            v = valueVector
         )
-        for (i in posArray.indices) {
-            valueVector[i] = posArray[i]
-        }
         return valueVector
     }
 
@@ -126,11 +119,8 @@
 
         monoSpline.getSlope(
             time = clampedPlayTime.toFloat() / SecondsToMillis,
-            v = slopeArray
+            v = velocityVector
         )
-        for (i in slopeArray.indices) {
-            velocityVector[i] = slopeArray[i]
-        }
         return velocityVector
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/androidUnitTest/kotlin/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/androidUnitTest/kotlin/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
index 3b85920..45ee3da 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/androidUnitTest/kotlin/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/androidUnitTest/kotlin/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
@@ -69,7 +69,7 @@
 
                     val cls = (
                         KotlinClassMetadata.read(metadataAnnotation) as KotlinClassMetadata.Class
-                    ).toKmClass()
+                    ).kmClass
                     return cls.localDelegatedProperties.map { it.name }
                 }
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractControlFlowTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractControlFlowTransformTests.kt
index f62ba3a..cb09bc4 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractControlFlowTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractControlFlowTransformTests.kt
@@ -24,9 +24,8 @@
     protected fun controlFlow(
         @Language("kotlin")
         source: String,
-        expectedTransformed: String,
         dumpTree: Boolean = false,
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.ReadOnlyComposable
@@ -35,7 +34,6 @@
 
             $source
         """.trimIndent(),
-        expectedTransformed,
         """
             import androidx.compose.runtime.Composable
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
index 722f19b..fd5eb21 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
@@ -71,6 +71,34 @@
         )
     }
 
+    fun verifyGoldenCrossModuleComposeIrTransform(
+        @Language("kotlin")
+        dependencySource: String,
+        @Language("kotlin")
+        source: String,
+        dumpTree: Boolean = false,
+        dumpClasses: Boolean = false,
+        validator: (element: IrElement) -> Unit = {},
+    ) {
+        val dependencyFileName = "Test_REPLACEME_${uniqueNumber++}"
+
+        classLoader(dependencySource, dependencyFileName, dumpClasses)
+            .allGeneratedFiles
+            .also {
+                // Write the files to the class directory so they can be used by the next module
+                // and the application
+                it.writeToDir(classesDirectory.root)
+            }
+
+        verifyGoldenComposeIrTransform(
+            source,
+            "",
+            validator = validator,
+            dumpTree = dumpTree,
+            additionalPaths = listOf(classesDirectory.root)
+        )
+    }
+
     fun transform(
         @Language("kotlin")
         source: String,
@@ -220,7 +248,12 @@
     ) {
         val actualTransformed =
             transform(source, extra, validator, dumpTree, truncateTracingInfoMode, additionalPaths)
-        goldenTransformRule.verifyGolden(GoldenTransformTestInfo(source, actualTransformed))
+        goldenTransformRule.verifyGolden(
+            GoldenTransformTestInfo(
+                source.trimIndent().trim(),
+                actualTransformed.trimIndent().trim()
+            )
+        )
     }
 
     private fun MatchResult.isNumber() = groupValues[1].isNotEmpty()
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
index f02eb49..a123bdf 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
@@ -108,14 +108,12 @@
     protected fun assertTransform(
         unchecked: String,
         checked: String,
-        expectedTransformed: String,
         dumpTree: Boolean = false
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             $checked
         """.trimIndent(),
-        expectedTransformed,
         """
             import androidx.compose.runtime.Composable
             $unchecked
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
index f0c1be2..7bfc0e5 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
@@ -1048,12 +1048,6 @@
     fun testEmptyClass() = assertTransform(
         """
             class Foo
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class Foo {
-              static val %stable: Int = 0
-            }
         """
     )
 
@@ -1102,103 +1096,11 @@
             class UnstableDelegateProp {
                 var p1 by UnstableDelegate()
             }
-        """,
-        """
-            @Stable
-            class StableDelegate {
-              fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) { }
-              fun getValue(thisObj: Any?, property: KProperty<*>): Int {
-                return 10
-              }
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class UnstableDelegate {
-              var value: Int = 0
-              fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
-                value = value
-              }
-              fun getValue(thisObj: Any?, property: KProperty<*>): Int {
-                return 10
-              }
-              static val %stable: Int = 8
-            }
-            @StabilityInferred(parameters = 0)
-            class Unstable {
-              var value: Int = 0
-              static val %stable: Int = 8
-            }
-            @StabilityInferred(parameters = 0)
-            class EmptyClass {
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class SingleStableVal(val p1: Int) {
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 1)
-            class SingleParamProp<T> (val p1: T) {
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class SingleParamNonProp<T> (p1: T) {
-              val p2: Int = p1.hashCode()
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 1)
-            class DoubleParamSingleProp<T, V> (val p1: T, p2: V) {
-              val p3: Int = p2.hashCode()
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class X<T> (val p1: List<T>) {
-              static val %stable: Int = 8
-            }
-            @StabilityInferred(parameters = 0)
-            class NonBackingFieldUnstableProp {
-              val p1: Unstable
-                get() {
-                  TODO()
-                }
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class NonBackingFieldUnstableVarProp {
-              var p1: Unstable
-                get() {
-                  TODO()
-                }
-                set(value) {
-                }
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class StableDelegateProp {
-              var p1: StableDelegate = StableDelegate()
-                get() {
-                  return <this>.p1%delegate.getValue(<this>, ::p1)
-                }
-                set(value) {
-                  <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
-                }
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class UnstableDelegateProp {
-              var p1: UnstableDelegate = UnstableDelegate()
-                get() {
-                  return <this>.p1%delegate.getValue(<this>, ::p1)
-                }
-                set(value) {
-                  <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
-                }
-              static val %stable: Int = 8
-            }
         """
     )
 
     @Test
-    fun testStabilityPropagationOfVariousTypes() = verifyCrossModuleComposeIrTransform(
+    fun testStabilityPropagationOfVariousTypes() = verifyGoldenCrossModuleComposeIrTransform(
         """
             package a
             import androidx.compose.runtime.Stable
@@ -1275,58 +1177,13 @@
                 A(StableDelegateProp())
                 A(UnstableDelegateProp())
             }
-        """,
-        """
-            @Composable
-            fun A(y: Any?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<A()>,<A(Empt...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(X(li...>,<A(X(li...>,<A(NonB...>,<A(NonB...>,<A(Stab...>,<A(Unst...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0010
-              }
-              if (%default and 0b0001 != 0b0001 || %dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  y = null
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(y)
-                A(null, %composer, 0, 0b0001)
-                A(EmptyClass(), %composer, EmptyClass.%stable, 0)
-                A(SingleStableValInt(123), %composer, SingleStableValInt.%stable, 0)
-                A(SingleStableVal(StableClass()), %composer, SingleStableVal.%stable, 0)
-                A(SingleParamProp(StableClass()), %composer, SingleParamProp.%stable or StableClass.%stable, 0)
-                A(SingleParamProp(UnstableClass()), %composer, SingleParamProp.%stable or UnstableClass.%stable, 0)
-                A(SingleParamNonProp(StableClass()), %composer, SingleParamNonProp.%stable, 0)
-                A(SingleParamNonProp(UnstableClass()), %composer, SingleParamNonProp.%stable, 0)
-                A(DoubleParamSingleProp(StableClass(), StableClass()), %composer, DoubleParamSingleProp.%stable or StableClass.%stable, 0)
-                A(DoubleParamSingleProp(UnstableClass(), StableClass()), %composer, DoubleParamSingleProp.%stable or UnstableClass.%stable, 0)
-                A(DoubleParamSingleProp(StableClass(), UnstableClass()), %composer, DoubleParamSingleProp.%stable or StableClass.%stable, 0)
-                A(DoubleParamSingleProp(UnstableClass(), UnstableClass()), %composer, DoubleParamSingleProp.%stable or UnstableClass.%stable, 0)
-                A(X(listOf(StableClass())), %composer, X.%stable, 0)
-                A(X(listOf(StableClass())), %composer, X.%stable, 0)
-                A(NonBackingFieldUnstableVal(), %composer, NonBackingFieldUnstableVal.%stable, 0)
-                A(NonBackingFieldUnstableVar(), %composer, NonBackingFieldUnstableVar.%stable, 0)
-                A(StableDelegateProp(), %composer, StableDelegateProp.%stable, 0)
-                A(UnstableDelegateProp(), %composer, UnstableDelegateProp.%stable, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(y, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
     @Test
-    fun testStabilityPropagationOfVariousTypesInSameModule() = verifyCrossModuleComposeIrTransform(
-        """
+    fun testStabilityPropagationOfVariousTypesInSameModule() =
+        verifyGoldenCrossModuleComposeIrTransform(
+            """
             package a
             import androidx.compose.runtime.Stable
             import kotlin.reflect.KProperty
@@ -1370,7 +1227,7 @@
             }
             fun used(x: Any?) {}
         """,
-        """
+            """
             import a.*
             import androidx.compose.runtime.Composable
 
@@ -1387,57 +1244,11 @@
                 A(StableDelegateProp())
                 A(UnstableDelegateProp())
             }
-        """,
         """
-            @StabilityInferred(parameters = 0)
-            class X<T> (val p1: List<T>) {
-              static val %stable: Int = 8
-            }
-            @StabilityInferred(parameters = 0)
-            class StableDelegateProp {
-              var p1: StableDelegate = StableDelegate()
-                get() {
-                  return <this>.p1%delegate.getValue(<this>, ::p1)
-                }
-                set(value) {
-                  <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
-                }
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class UnstableDelegateProp {
-              var p1: UnstableDelegate = UnstableDelegate()
-                get() {
-                  return <this>.p1%delegate.getValue(<this>, ::p1)
-                }
-                set(value) {
-                  <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
-                }
-              static val %stable: Int = UnstableDelegate.%stable
-            }
-            @Composable
-            fun A(y: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<A(X(li...>,<A(Stab...>,<A(Unst...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(y)
-              A(X(listOf(StableClass())), %composer, 0b1000)
-              A(StableDelegateProp(), %composer, 0)
-              A(UnstableDelegateProp(), %composer, UnstableDelegate.%stable)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(y, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """
-    )
+        )
 
     @Test
-    fun testEmptyClassAcrossModules() = verifyCrossModuleComposeIrTransform(
+    fun testEmptyClassAcrossModules() = verifyGoldenCrossModuleComposeIrTransform(
         """
             package a
             class Wrapper<T>(value: T) {
@@ -1454,36 +1265,19 @@
                 used(y)
                 A(Wrapper(Foo()))
             }
-        """,
-        """
-            @Composable
-            fun A(y: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<A(Wrap...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(y)
-              A(Wrapper(Foo()), %composer, Wrapper.%stable)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(y, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun testLocalParameterBasedTypeParameterSubstitution() = verifyCrossModuleComposeIrTransform(
-        """
+    fun testLocalParameterBasedTypeParameterSubstitution() =
+        verifyGoldenCrossModuleComposeIrTransform(
+            """
             package a
             import androidx.compose.runtime.Composable
             class Wrapper<T>(val value: T)
             @Composable fun A(y: Any) {}
         """,
-        """
+            """
             import a.*
             import androidx.compose.runtime.Composable
 
@@ -1499,88 +1293,6 @@
                     A(Wrapper(item))
                 }
             }
-        """,
-        """
-            @Composable
-            fun <V> B(value: V, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B)<A(Wrap...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(Wrapper(value), %composer, Wrapper.%stable or 0b1000 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(value, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun <T> X(items: List<T>, itemContent: Function3<T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(X)P(1)*<itemCo...>:Test.kt")
-              val %dirty = %changed
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %dirty, -1, <>)
-              }
-              val <iterator> = items.iterator()
-              while (<iterator>.hasNext()) {
-                val item = <iterator>.next()
-                itemContent(item, %composer, 0b01110000 and %dirty)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                X(items, itemContent, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun C(items: List<String>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(C)<X(item...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              X(items, ComposableSingletons%TestKt.lambda-1, %composer, 0b00111000)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                C(items, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function3<String, Composer, Int, Unit> = composableLambdaInstance(<>, false) { item: String, %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<A(item...>,<A(Wrap...>:Test.kt")
-                val %dirty = %changed
-                if (%changed and 0b1110 == 0) {
-                  %dirty = %dirty or if (%composer.changed(item)) 0b0100 else 0b0010
-                }
-                if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %dirty, -1, <>)
-                  }
-                  A(item, %composer, 0b1110 and %dirty)
-                  A(Wrapper(item), %composer, Wrapper.%stable or 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -1589,16 +1301,6 @@
         """
             class Stable(val bar: Int)
             class Unstable(var bar: Int)
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class Stable(val bar: Int) {
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class Unstable(var bar: Int) {
-              static val %stable: Int = 8
-            }
         """
     )
 
@@ -1615,43 +1317,6 @@
             @Composable fun B(x: Any) {
                 used(x)
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class Foo {
-              static val %stable: Int = 0
-            }
-            @Composable
-            fun A(y: Int, x: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)P(1)<B(x)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(y)
-              B(x, %composer, 0b1000)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(y, x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun B(x: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(x)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1668,43 +1333,6 @@
             @Composable fun B(x: Any) {
                 used(x)
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class Foo(var bar: Int = 0) {
-              static val %stable: Int = 8
-            }
-            @Composable
-            fun A(y: Int, x: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)P(1)<B(x)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(y)
-              B(x, %composer, 0b1000)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(y, x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun B(x: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(x)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1911,12 +1539,10 @@
     private fun assertTransform(
         @Language("kotlin")
         checked: String,
-        expectedTransformed: String,
         unchecked: String = "",
         dumpTree: Boolean = false
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         checked,
-        expectedTransformed,
         """
             $unchecked
             fun used(x: Any?) {}
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
index 669b972..cd9027b 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
@@ -33,10 +33,9 @@
     private fun composerParam(
         @Language("kotlin")
         source: String,
-        expectedTransformed: String,
         validator: (element: IrElement) -> Unit = { },
         dumpTree: Boolean = false
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         """
             @file:OptIn(
               InternalComposeApi::class,
@@ -50,7 +49,6 @@
 
             $source
         """.trimIndent(),
-        expectedTransformed,
         """
             package test
             fun used(x: Any?) {}
@@ -67,37 +65,6 @@
             @NonRestartableComposable @Composable fun Example() {
                 bar
             }
-        """,
-        """
-            val bar: Int
-              @Composable @JvmName(name = "getBar")
-              get() {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C:Test.kt#2487m")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val tmp0 = 123
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                return tmp0
-              }
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<bar>:Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              <get-bar>(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -115,32 +82,6 @@
                 @Composable
                 override fun bar() {}
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            abstract class BaseFoo {
-              @NonRestartableComposable
-              @Composable
-              abstract fun bar(%composer: Composer?, %changed: Int)
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class FooImpl : BaseFoo {
-              @NonRestartableComposable
-              @Composable
-              override fun bar(%composer: Composer?, %changed: Int) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(bar):Test.kt#2487m")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-              }
-              static val %stable: Int = 0
-            }
         """
     )
 
@@ -164,67 +105,6 @@
                 goo()
                 Bar().baz()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Wat(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Wat):Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-            @NonRestartableComposable
-            @Composable
-            fun Foo(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Foo)<Wat()>,<goo()>,<baz()>:Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Wat(%composer, 0)
-              @NonRestartableComposable
-              @Composable
-              fun goo(%composer: Composer?, %changed: Int) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(goo)<Wat()>:Test.kt#2487m")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Wat(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-              }
-              class Bar {
-                @NonRestartableComposable
-                @Composable
-                fun baz(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(baz)<Wat()>:Test.kt#2487m")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Wat(%composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                }
-              }
-              goo(%composer, 0)
-              Bar().baz(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -240,46 +120,7 @@
             fun VarArgsCaller() {
                 VarArgsFirst()
             }
-        """,
-        """
-            @Composable
-            fun VarArgsFirst(foo: Array<out Any?>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(VarArgsFirst):Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              println(foo)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                VarArgsFirst(*foo, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun VarArgsCaller(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(VarArgsCaller)<VarArg...>:Test.kt#2487m")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                VarArgsFirst(
-                  %composer = %composer,
-                  %changed = 8
-                )
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                VarArgsCaller(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """
+            """
     )
 
     // Regression test for b/286132194
@@ -296,52 +137,6 @@
             fun Test() {
                 B(0, 1, 2, 3)
             }
-        """,
-        """
-            @Composable
-            fun B(values: IntArray, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt#2487m")
-              val %dirty = %changed
-              %composer.startMovableGroup(<>, values.size)
-              val <iterator> = values.iterator()
-              while (<iterator>.hasNext()) {
-                val value = <iterator>.next()
-                %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
-              }
-              %composer.endMovableGroup()
-              if (%dirty and 0b1110 == 0) {
-                %dirty = %dirty or 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                print(values)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(*values, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @NonRestartableComposable
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)<B(0,>:Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              B(0, 1, 2, 3, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -368,41 +163,6 @@
                     }
                 }
             }
-        """,
-        """
-            fun A() { }
-            val b: Int
-              get() {
-                return 123
-              }
-            fun C(x: Int) {
-              var x = 0
-              x++
-              class D {
-                fun E() {
-                  A()
-                }
-                val F: Int
-                  get() {
-                    return 123
-                  }
-              }
-              val g = <block>{
-                object {
-                  fun H() { }
-                }
-              }
-            }
-            fun I(block: Function0<Unit>) {
-              block()
-            }
-            fun J() {
-              I {
-                I {
-                  A()
-                }
-              }
-            }
         """
     )
 
@@ -413,22 +173,6 @@
             @Composable fun Example() {
                 Example()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<Exampl...>:Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Example(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -443,34 +187,6 @@
             @Composable fun Test() {
                 Example {}
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "CC(Example)<conten...>:Test.kt#2487m")
-              content(%composer, 0b1110 and %changed)
-              %composer.endReplaceableGroup()
-            }
-            @NonRestartableComposable
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Example({ %composer: Composer?, %changed: Int ->
-                sourceInformationMarkerStart(%composer, <>, "C:Test.kt#2487m")
-                Unit
-                sourceInformationMarkerEnd(%composer)
-              }, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -480,24 +196,6 @@
             val myProperty: () -> Unit @Composable get() {
                 return {  }
             }
-        """,
-        """
-            val myProperty: Function0<Unit>
-              @Composable @JvmName(name = "getMyProperty")
-              get() {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C:Test.kt#2487m")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val tmp0 = {
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                return tmp0
-              }
         """
     )
 
@@ -515,21 +213,6 @@
                     }
                 }
             }
-        """,
-        """
-            interface A {
-              open fun b() { }
-            }
-            @StabilityInferred(parameters = 0)
-            class C {
-              val foo: Int = 1
-              inner class D : A {
-                override fun b() {
-                  print(foo)
-                }
-              }
-              static val %stable: Int = 0
-            }
         """
     )
 
@@ -558,94 +241,6 @@
                     }
                 }
             """,
-            """
-                @Composable
-                @ComposableInferredTarget(scheme = "[0[0]]")
-                fun Wrapper(block: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>)
-                  sourceInformation(%composer, "C(Wrapper)<block(...>:Test.kt#2487m")
-                  val %dirty = %changed
-                  if (%changed and 0b1110 == 0) {
-                    %dirty = %dirty or if (%composer.changedInstance(block)) 0b0100 else 0b0010
-                  }
-                  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %dirty, -1, <>)
-                    }
-                    block(%composer, 0b1110 and %dirty)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    Wrapper(block, %composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                }
-                @Composable
-                fun Leaf(text: String, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>)
-                  sourceInformation(%composer, "C(Leaf):Test.kt#2487m")
-                  val %dirty = %changed
-                  if (%changed and 0b1110 == 0) {
-                    %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
-                  }
-                  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %dirty, -1, <>)
-                    }
-                    used(text)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    Leaf(text, %composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                }
-                @Composable
-                fun Test(value: Int, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt#2487m")
-                  val %dirty = %changed
-                  if (%changed and 0b1110 == 0) {
-                    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0b0010
-                  }
-                  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %dirty, -1, <>)
-                    }
-                    %composer.startMovableGroup(<>, value)
-                    sourceInformation(%composer, "<Wrappe...>")
-                    Wrapper(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-                      sourceInformation(%composer, "C<Leaf("...>:Test.kt#2487m")
-                      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                        if (isTraceInProgress()) {
-                          traceEventStart(<>, %changed, -1, <>)
-                        }
-                        Leaf("Value %value", %composer, 0)
-                        if (isTraceInProgress()) {
-                          traceEventEnd()
-                        }
-                      } else {
-                        %composer.skipToGroupEnd()
-                      }
-                    }, %composer, 0b0110)
-                    %composer.endMovableGroup()
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    Test(value, %composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                }
-            """,
             validator = { element ->
                 // Validate that no composers are captured by nested lambdas
                 var currentComposer: IrValueParameter? = null
@@ -704,49 +299,7 @@
                 inline fun emit(composable: @Composable () -> Unit) {
                     composable()
                 }
-            """,
             """
-                @Composable
-                @ComposableInferredTarget(scheme = "[0[0]]")
-                fun composeVector(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>)
-                  sourceInformation(%composer, "C(composeVector)<emit>:Test.kt#2487m")
-                  val %dirty = %changed
-                  if (%changed and 0b1110 == 0) {
-                    %dirty = %dirty or if (%composer.changedInstance(composable)) 0b0100 else 0b0010
-                  }
-                  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %dirty, -1, <>)
-                    }
-                    emit({ %composer: Composer?, %changed: Int ->
-                      sourceInformationMarkerStart(%composer, <>, "C<emit>:Test.kt#2487m")
-                      emit({ %composer: Composer?, %changed: Int ->
-                        sourceInformationMarkerStart(%composer, <>, "C<compos...>:Test.kt#2487m")
-                        composable(%composer, 0b1110 and %dirty)
-                        sourceInformationMarkerEnd(%composer)
-                      }, %composer, 0)
-                      sourceInformationMarkerEnd(%composer)
-                    }, %composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    composeVector(composable, %composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                }
-                @Composable
-                @ComposableInferredTarget(scheme = "[0[0]]")
-                fun emit(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "CC(emit)<compos...>:Test.kt#2487m")
-                  composable(%composer, 0b1110 and %changed)
-                  %composer.endReplaceableGroup()
-                }
-            """.trimIndent()
         )
     }
 
@@ -780,116 +333,6 @@
                     println(bar.foo)
                 }
             """,
-            """
-                @StabilityInferred(parameters = 0)
-                class Foo {
-                  static val %stable: Int = 0
-                }
-                @Composable
-                fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(getValue)P(1):Test.kt#2487m")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  val tmp0 = <this>
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                  return tmp0
-                }
-                @StabilityInferred(parameters = 0)
-                class FooDelegate {
-                  @Composable
-                  fun getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): FooDelegate {
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "C(getValue)P(1):Test.kt#2487m")
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    val tmp0 = <this>
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %composer.endReplaceableGroup()
-                    return tmp0
-                  }
-                  static val %stable: Int = 0
-                }
-                @StabilityInferred(parameters = 0)
-                class Bar {
-                  val foo: Foo = Foo()
-                    @Composable @JvmName(name = "getFoo")
-                    get() {
-                      sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, <>)
-                      }
-                      val tmp0 = <this>.foo%delegate.getValue(<this>, ::foo, %composer, 0b001000000000 or 0b01110000 and %changed shl 0b0011)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                      sourceInformationMarkerEnd(%composer)
-                      return tmp0
-                    }
-                  static val %stable: Int = 0
-                }
-                @Composable
-                fun test(%composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>)
-                  sourceInformation(%composer, "C(test)*<foo>,<fooDel...>,<foo>:Test.kt#2487m")
-                  if (%changed != 0 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    val foo by {
-                      val foo%delegate = Foo()
-                      @Composable
-                      get(%composer: Composer?, %changed: Int) {
-                        sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
-                        if (isTraceInProgress()) {
-                          traceEventStart(<>, %changed, -1, <>)
-                        }
-                        val tmp0 = foo%delegate.getValue(null, ::foo%delegate, %composer, 0b00110000)
-                        if (isTraceInProgress()) {
-                          traceEventEnd()
-                        }
-                        sourceInformationMarkerEnd(%composer)
-                        return tmp0
-                      }
-                    }
-                    val fooDelegate by {
-                      val fooDelegate%delegate = FooDelegate()
-                      @Composable
-                      get(%composer: Composer?, %changed: Int) {
-                        sourceInformationMarkerStart(%composer, <>, "C<FooDel...>:Test.kt#2487m")
-                        if (isTraceInProgress()) {
-                          traceEventStart(<>, %changed, -1, <>)
-                        }
-                        val tmp0 = fooDelegate%delegate.getValue(null, ::fooDelegate%delegate, %composer, 0b0110)
-                        if (isTraceInProgress()) {
-                          traceEventEnd()
-                        }
-                        sourceInformationMarkerEnd(%composer)
-                        return tmp0
-                      }
-                    }
-                    val bar = Bar()
-                    println(<get-foo>(%composer, 0))
-                    println(<get-fooDelegate>(%composer, 0))
-                    println(bar.<get-foo>(%composer, 0))
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    test(%composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                }
-            """,
         )
     }
 
@@ -910,57 +353,7 @@
                     val foo by Foo()
                     println(foo)
                 }
-            """,
-        """
-            @StabilityInferred(parameters = 0)
-            class Foo {
-              var unstableField: Int = 0
-              static val %stable: Int = 8
-            }
-            @Composable
-            fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "CC(getValue)P(1):Test.kt#2487m")
-              val tmp0 = <this>
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
-            @Composable
-            fun test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(test)*<foo>:Test.kt#2487m")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val foo by {
-                  val foo%delegate = Foo()
-                  @Composable
-                  get(%composer: Composer?, %changed: Int) {
-                    sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    val tmp0 = foo%delegate.getValue(null, ::foo%delegate, %composer, 0b00111000)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    sourceInformationMarkerEnd(%composer)
-                    return tmp0
-                  }
-                }
-                println(<get-foo>(%composer, 0))
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """
+            """
     )
 
     @Test
@@ -978,59 +371,6 @@
                 val delegated by foo
                 used(delegated)
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class Foo {
-              static val %stable: Int = 0
-            }
-            @Composable
-            fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "CC(getValue)P(1):Test.kt#2487m")
-              val tmp0 = <this>
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
-            @Composable
-            fun test(foo: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(test)<delega...>:Test.kt#2487m")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val delegated by {
-                  val delegated%delegate = foo
-                  @Composable
-                  get(%composer: Composer?, %changed: Int) {
-                    sourceInformationMarkerStart(%composer, <>, "C<foo>:Test.kt#2487m")
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    val tmp0 = delegated%delegate.getValue(null, ::delegated%delegate, %composer, 0b00110000 or 0b1110 and %dirty)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    sourceInformationMarkerEnd(%composer)
-                    return tmp0
-                  }
-                }
-                used(<get-delegated>(%composer, 0))
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                test(foo, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1052,20 +392,6 @@
                 val hc = l.hashCode()
             }
         """.trimIndent(),
-        expectedTransformed = """
-            fun abc0(l: Function2<Composer, Int, Unit>) {
-              val hc = l.hashCode()
-            }
-            fun abc1(l: Function3<String, Composer, Int, Unit>) {
-              val hc = l.hashCode()
-            }
-            fun abc2(l: Function4<String, Int, Composer, Int, Unit>) {
-              val hc = l.hashCode()
-            }
-            fun abc3(l: Function15<Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Composer, Int, Int, Any>) {
-              val hc = l.hashCode()
-            }
-        """.trimIndent(),
         validator = {
             val expectedArity = listOf(2, 3, 4, 15)
             var i = 0 // to iterate over `hashCode` calls
@@ -1088,7 +414,7 @@
 
     @Test
     fun validateNoComposableFunctionReferencesInOverriddenSymbols() =
-        verifyCrossModuleComposeIrTransform(
+        verifyGoldenCrossModuleComposeIrTransform(
             dependencySource = """
             package dependency
 
@@ -1129,19 +455,12 @@
                         }
                     }
                 })
-            },
-            expectedTransformed = """
-            @StabilityInferred(parameters = 0)
-            class ContentImpl : Content {
-              override fun setContent(c: Function2<Composer, Int, Unit>) { }
-              static val %stable: Int = 0
             }
-        """.trimIndent()
         )
 
     @Test
     fun validateNoComposableFunctionReferencesInCalleeOverriddenSymbols() =
-        verifyCrossModuleComposeIrTransform(
+        verifyGoldenCrossModuleComposeIrTransform(
             dependencySource = """
             package dependency
 
@@ -1189,22 +508,6 @@
                         super.visitCall(expression)
                     }
                 })
-            },
-            expectedTransformed = """
-            @Composable
-            @NonRestartableComposable
-            fun Foo(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Foo):Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              ContentImpl().setContent()
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
             }
-        """.trimIndent()
         )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ContextReceiversTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ContextReceiversTransformTests.kt
index fa7a214..634e8de 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ContextReceiversTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ContextReceiversTransformTests.kt
@@ -40,14 +40,12 @@
         unchecked: String,
         @Language("kotlin")
         checked: String,
-        expectedTransformed: String,
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.Composable
 
             $checked
         """.trimIndent(),
-        expectedTransformed = expectedTransformed,
         extra = """
             import androidx.compose.runtime.Composable
 
@@ -66,26 +64,6 @@
             context(Foo)
             @Composable
             fun Test() { }
-        """,
-        """
-            @Composable
-            fun Test(%context_receiver_0: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%context_receiver_0, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -104,44 +82,6 @@
             context(Foo, Bar, FooBar)
             @Composable
             fun B() { }
-        """,
-        """
-            @Composable
-            fun A(%context_receiver_0: Foo, %context_receiver_1: Bar, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(%context_receiver_0, %context_receiver_1, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(%context_receiver_0, %context_receiver_1, %context_receiver_2, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -160,44 +100,6 @@
             context(Foo, Bar, FooBar)
             @Composable
             fun String.B() { }
-        """,
-        """
-            @Composable
-            fun String.A(%context_receiver_0: Foo, %context_receiver_1: Bar, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(%context_receiver_0, %context_receiver_1, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun String.B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(%context_receiver_0, %context_receiver_1, %context_receiver_2, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -220,85 +122,6 @@
             context(Foo)
             @Composable
             fun C(a: Int, bar: Bar = Bar()) { }
-        """,
-        """
-            @Composable
-            fun A(%context_receiver_0: Foo, %context_receiver_1: Bar, a: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (%default and 0b0100 != 0) {
-                  a = 1
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(%context_receiver_0, %context_receiver_1, a, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            @Composable
-            fun B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, a: Int, b: String?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (%default and 0b00010000 != 0) {
-                  b = ""
-                }
-                if (%default and 0b00100000 != 0) {
-                  c = 1
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(%context_receiver_0, %context_receiver_1, %context_receiver_2, a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            @Composable
-            fun C(%context_receiver_0: Foo, a: Int, bar: Bar?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(C):Test.kt")
-              val %dirty = %changed
-              if (%dirty and 0b0001 != 0 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0100 != 0) {
-                    bar = Bar()
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0100 != 0) {
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                C(%context_receiver_0, a, bar, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -313,32 +136,6 @@
             context(Foo, Bar, FooBar)
             @Composable
             fun String.B(a: Int, b: String = "", c: Int = 1) { }
-        """,
-        """
-        @Composable
-        fun String.B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, a: Int, b: String?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(B):Test.kt")
-          if (%changed and 0b0001 != 0 || !%composer.skipping) {
-            if (%default and 0b00010000 != 0) {
-              b = ""
-            }
-            if (%default and 0b00100000 != 0) {
-              c = 1
-            }
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            B(%context_receiver_0, %context_receiver_1, %context_receiver_2, a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
-          }
-        }
         """
     )
 
@@ -359,33 +156,6 @@
                   A()
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                with(foo) {
-                  A(%this%with, %composer, 0)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -413,36 +183,6 @@
                     }
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)*<A()>,<B()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                with(foo) {
-                  A(%this%with, %composer, 0)
-                  with(Bar()) {
-                    B(%this%with, %this%with, %composer, 0)
-                  }
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -462,33 +202,6 @@
                   "Hello".A(2)
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)*<A(2)>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                with(foo) {
-                  "Hello".A(%this%with, 2, null, %composer, 0b000110000110, 0b0100)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -513,26 +226,6 @@
             @Composable
             fun Test() {
             }
-        """,
-        """
-            @Composable
-            fun Test(%context_receiver_0: A, %context_receiver_1: B, %context_receiver_2: C, %context_receiver_3: D, %context_receiver_4: E, %context_receiver_5: F, %context_receiver_6: G, %context_receiver_7: H, %context_receiver_8: I, %context_receiver_9: J, %context_receiver_10: K, %context_receiver_11: L, %composer: Composer?, %changed: Int, %changed1: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed and 0b0001 != 0 || %changed1 and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, %changed1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%context_receiver_0, %context_receiver_1, %context_receiver_2, %context_receiver_3, %context_receiver_4, %context_receiver_5, %context_receiver_6, %context_receiver_7, %context_receiver_8, %context_receiver_9, %context_receiver_10, %context_receiver_11, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1))
-              }
-            }
         """
     )
 
@@ -548,32 +241,6 @@
                 fun Test(a: String, b: @Composable (String) -> Unit) {
                     b("yay")
                 }
-            """,
-            """
-                @Composable
-                @ComposableInferredTarget(scheme = "[0[0]]")
-                fun Test(%context_receiver_0: Foo, a: String, b: Function3<String, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>)
-                  sourceInformation(%composer, "C(Test)<b("yay...>:Test.kt")
-                  val %dirty = %changed
-                  if (%changed and 0b001110000000 == 0) {
-                    %dirty = %dirty or if (%composer.changedInstance(b)) 0b000100000000 else 0b10000000
-                  }
-                  if (%dirty and 0b001010000001 != 0b10000000 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %dirty, -1, <>)
-                    }
-                    b("yay", %composer, 0b0110 or 0b01110000 and %dirty shr 0b0011)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    Test(%context_receiver_0, a, b, %composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                }
             """
         )
     }
@@ -604,76 +271,6 @@
                     println("Same same")
                 }
             }
-        """,
-        """
-            @Composable
-            fun Parent(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Parent)*<Test()>,<Test(a>,<Test(b>,<Test(a>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                with(Foo()) {
-                  Test(%this%with, null, 0, %composer, 0, 0b0110)
-                  Test(%this%with, "a", 0, %composer, 0b00110000, 0b0100)
-                  Test(%this%with, null, 101, %composer, 0b000110000000, 0b0010)
-                  Test(%this%with, "Yes", 10, %composer, 0b000110110000, 0)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Parent(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test(%context_receiver_0: Foo, a: String?, b: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(%context_receiver_0)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(b)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                if (%default and 0b0010 != 0) {
-                  a = "A"
-                }
-                if (%default and 0b0100 != 0) {
-                  b = 2
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val combineParams = a + b
-                if (%context_receiver_0.someString == combineParams) {
-                  println("Same same")
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%context_receiver_0, a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
index fd11df1..ceb9845 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
@@ -30,24 +30,6 @@
                     NA()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                NA()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -59,23 +41,6 @@
             fun Example() {
                 B() && B()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<B()>,<B()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0_group = B(%composer, 0) && B(%composer, 0)
-              tmp0_group
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -87,23 +52,6 @@
             fun Example() {
                 B() || B()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<B()>,<B()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0_group = B(%composer, 0) || B(%composer, 0)
-              tmp0_group
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -118,24 +66,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                A(%composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -153,32 +83,6 @@
                     A(b)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<A(a)>")
-                A(a, %composer, 0)
-                %composer.endReplaceableGroup()
-              } else {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<A(b)>")
-                A(b, %composer, 0)
-                %composer.endReplaceableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -196,39 +100,17 @@
                     NA()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<B()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (B(%composer, 0)) {
-                NA()
-              } else {
-                NA()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
     private fun verifyInlineReturn(
         @Language("kotlin")
         source: String,
-        expectedTransformed: String,
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             $source
         """,
-        expectedTransformed,
         """
             import androidx.compose.runtime.Composable
 
@@ -284,51 +166,6 @@
                 }
                 A()
             }
-
-        """,
-        """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A()>,<M3>,<A()>:Test.kt")
-              val tmp0_marker = %composer.currentMarker
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                M3({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  if (condition) {
-                    %composer.endToMarker(tmp0_marker)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
-                      Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                    return
-                  }
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -354,71 +191,6 @@
                 }
                 A()
             }
-
-        """,
-        """
-            @Composable
-            fun Test(a: Boolean, b: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A()>,<M3>,<M3>,<A()>:Test.kt")
-              val tmp0_marker = %composer.currentMarker
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                M3({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  if (a) {
-                    %composer.endToMarker(tmp0_marker)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
-                      Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                    return
-                  }
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                M3({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  if (b) {
-                    %composer.endToMarker(tmp0_marker)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
-                      Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                    return
-                  }
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -437,49 +209,11 @@
                 }
                 A()
             }
-
-        """,
-        """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A()>,<M3>,<A()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                M3({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  if (condition) {
-                    %composer.endReplaceableGroup()
-                    return@M3
-                  }
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun testInline_Lambda() = verifyComposeIrTransform(
+    fun testInline_Lambda() = verifyGoldenComposeIrTransform(
         """
             fun Test(condition: Boolean) {
                 T {
@@ -492,39 +226,6 @@
             }
         """,
         """
-            fun Test(condition: Boolean) {
-              T {
-                %this%T.compose(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                  sourceInformation(%composer, "C<M1>:Test.kt")
-                  val tmp0_marker = %composer.currentMarker
-                  if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    M1({ %composer: Composer?, %changed: Int ->
-                      %composer.startReplaceableGroup(<>)
-                      sourceInformation(%composer, "C:Test.kt")
-                      if (condition) {
-                        %composer.endToMarker(tmp0_marker)
-                        if (isTraceInProgress()) {
-                          traceEventEnd()
-                        }
-                        return@composableLambdaInstance
-                      }
-                      %composer.endReplaceableGroup()
-                    }, %composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                }
-                )
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.*
 
             class Scope {
@@ -558,47 +259,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @Composable
-            fun Test_M3_M1_Return_M1(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test_M3_M1_Return_M1)<A()>,<M3>,<A()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                M3({ %composer: Composer?, %changed: Int ->
-                  sourceInformationMarkerStart(%composer, <>, "C<A()>,<M1>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  M1({ %composer: Composer?, %changed: Int ->
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "C:Test.kt")
-                    if (condition) {
-                      %composer.endReplaceableGroup()
-                      return@M1
-                    }
-                    %composer.endReplaceableGroup()
-                  }, %composer, 0)
-                  A(%composer, 0)
-                  sourceInformationMarkerEnd(%composer)
-                }, %composer, 0)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test_M3_M1_Return_M1(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -619,49 +279,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @Composable
-            fun Test_M3_M1_Return_M3(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test_M3_M1_Return_M3)<A()>,<M3>,<A()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                M3({ %composer: Composer?, %changed: Int ->
-                  val tmp0_marker = %composer.currentMarker
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<M1>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  M1({ %composer: Composer?, %changed: Int ->
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "C:Test.kt")
-                    if (condition) {
-                      %composer.endToMarker(tmp0_marker)
-                      return@M3
-                    }
-                    %composer.endReplaceableGroup()
-                  }, %composer, 0)
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test_M3_M1_Return_M3(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -684,58 +301,6 @@
                 }
                 A()
             }
-
-        """,
-        """
-            @Composable
-            fun testInline_M1_W_Return_Func(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(testInline_M1_W_Return_Func)<A()>,<M1>,<A()>:Test.kt")
-              val tmp0_marker = %composer.currentMarker
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                M1({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "*<A()>,<A()>")
-                  while (true) {
-                    A(%composer, 0)
-                    if (condition) {
-                      %composer.endToMarker(tmp0_marker)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                      %composer@testInline_M1_W_Return_Func.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                        testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                      }
-                      return
-                    }
-                    A(%composer, 0)
-                  }
-                  %composer.endReplaceableGroup()
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -761,55 +326,6 @@
                 }
                 A()
             }
-
-        """,
-        """
-            @Composable
-            fun testInline_M1_W_Return_Func(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(testInline_M1_W_Return_Func)<A()>,<M3>,<M3>,<A()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                M3({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  if (condition) {
-                    %composer.endReplaceableGroup()
-                    return@M3
-                  }
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                M3({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  if (condition) {
-                    %composer.endReplaceableGroup()
-                    return@M3
-                  }
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -832,61 +348,6 @@
                 }
                 Text("Root - end")
             }
-
-        """,
-        """
-            @Composable
-            fun test_CM1_CCM1_RetFun(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(test_CM1_CCM1_RetFun)<Text("...>,<M1>,<Text("...>:Test.kt")
-              val tmp0_marker = %composer.currentMarker
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Text("Root - before", %composer, 0b0110)
-                M1({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
-                  Text("M1 - begin", %composer, 0b0110)
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<Text("...>,<M1>")
-                  if (condition) {
-                    Text("if - begin", %composer, 0b0110)
-                    M1({ %composer: Composer?, %changed: Int ->
-                      %composer.startReplaceableGroup(<>)
-                      sourceInformation(%composer, "C<Text("...>:Test.kt")
-                      Text("In CCM1", %composer, 0b0110)
-                      %composer.endToMarker(tmp0_marker)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                      %composer@test_CM1_CCM1_RetFun.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                        test_CM1_CCM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                      }
-                      return
-                      %composer.endReplaceableGroup()
-                    }, %composer, 0)
-                  }
-                  %composer.endReplaceableGroup()
-                  Text("M1 - end", %composer, 0b0110)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                Text("Root - end", %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                test_CM1_CCM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -907,39 +368,6 @@
             inline fun FakeBox(content: @Composable () -> Unit) {
                 content()
             }
-        """,
-        """
-            @Composable
-            @NonRestartableComposable
-            fun CustomTextBroken(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(CustomTextBroken)<FakeBo...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              FakeBox({ %composer: Composer?, %changed: Int ->
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C<A()>:Test.kt")
-                if (condition) {
-                  %composer.endReplaceableGroup()
-                  return@FakeBox
-                }
-                A(%composer, 0)
-                %composer.endReplaceableGroup()
-              }, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun FakeBox(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "CC(FakeBox)<conten...>:Test.kt")
-              content(%composer, 0b1110 and %changed)
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -958,56 +386,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            object obj {
-              val condition: Boolean = true
-              static val %stable: Int = 0
-            }
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                if (condition) {
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                  return
-                }
-                with(obj) {
-                  if (condition) {
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                      Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                    return
-                  }
-                }
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1030,49 +408,6 @@
                     return currentComposer.inserting
                 }
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            object obj {
-              val condition: Boolean = false
-              static val %stable: Int = 0
-            }
-            @Composable
-            @ReadOnlyComposable
-            fun Calculate(condition: Boolean, %composer: Composer?, %changed: Int): Boolean {
-              sourceInformationMarkerStart(%composer, <>, "C(Calculate):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (condition) {
-                val tmp0_return = false
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                sourceInformationMarkerEnd(%composer)
-                return tmp0_return
-              }
-              with(obj) {
-                if (condition) {
-                  val tmp0_return = false
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  sourceInformationMarkerEnd(%composer)
-                  return tmp0_return
-                }
-                val tmp1_return = %composer.inserting
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                sourceInformationMarkerEnd(%composer)
-                return tmp1_return
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              sourceInformationMarkerEnd(%composer)
-            }
         """
     )
 
@@ -1086,40 +421,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<IW>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                IW({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>:Test.kt")
-                  if (condition) {
-                    %composer.endReplaceableGroup()
-                    return@IW
-                  }
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1134,43 +435,6 @@
                 }
                 Text("Some more text")
             }
-        """,
-        expectedTransformed = """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Text("...>,<Text("...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Text("Some text", %composer, 0b0110)
-                Identity {
-                  if (condition) {
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                      Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                    return
-                  }
-                }
-                Text("Some more text", %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1186,51 +450,7 @@
                     }
                 }
                 Text("Some more text")
-            }
-        """,
-        expectedTransformed = """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Text("...>,<M1>,<Text("...>:Test.kt")
-              val tmp0_marker = %composer.currentMarker
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Text("Some text", %composer, 0b0110)
-                M1({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C:Test.kt")
-                  Identity {
-                    if (condition) {
-                      %composer.endToMarker(tmp0_marker)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                        Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                      }
-                      return
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                Text("Some more text", %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
+            } 
         """
     )
 
@@ -1247,48 +467,11 @@
                 }
                 Text("Some more text")
             }
-        """,
-        expectedTransformed = """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Text("...>,<M1>,<Text("...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Text("Some text", %composer, 0b0110)
-                M1({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C:Test.kt")
-                  Identity {
-                    if (condition) {
-                      %composer.endReplaceableGroup()
-                      return@M1
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                Text("Some more text", %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun verifyEarlyExitFromNestedInlineFunction() = verifyComposeIrTransform(
+    fun verifyEarlyExitFromNestedInlineFunction() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -1308,40 +491,6 @@
                 Text("Before outer")
             }
         """,
-        expectedTransformed = """
-            @Composable
-            @NonRestartableComposable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)<Text("...>,<Inline...>,<Text("...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Text("Before outer", %composer, 0b0110)
-              InlineLinearA({ %composer: Composer?, %changed: Int ->
-                sourceInformationMarkerStart(%composer, <>, "C<Text("...>,<Inline...>,<Text("...>:Test.kt")
-                Text("Before inner", %composer, 0b0110)
-                InlineLinearB({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
-                  Text("Before return", %composer, 0b0110)
-                  if (condition) {
-                    %composer.endReplaceableGroup()
-                    return@InlineLinearB
-                  }
-                  Text("After return", %composer, 0b0110)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                Text("After inner", %composer, 0b0110)
-                sourceInformationMarkerEnd(%composer)
-              }, %composer, 0)
-              Text("Before outer", %composer, 0b0110)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
@@ -1361,7 +510,7 @@
     )
 
     @Test
-    fun verifyEarlyExitFromMultiLevelNestedInlineFunction() = verifyComposeIrTransform(
+    fun verifyEarlyExitFromMultiLevelNestedInlineFunction() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -1381,42 +530,6 @@
                 Text("Before outer")
             }
         """,
-        expectedTransformed = """
-            @Composable
-            @NonRestartableComposable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)<Text("...>,<Inline...>,<Text("...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Text("Before outer", %composer, 0b0110)
-              InlineLinearA({ %composer: Composer?, %changed: Int ->
-                val tmp0_marker = %composer.currentMarker
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C<Text("...>,<Inline...>,<Text("...>:Test.kt")
-                Text("Before inner", %composer, 0b0110)
-                InlineLinearB({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
-                  Text("Before return", %composer, 0b0110)
-                  if (condition) {
-                    %composer.endToMarker(tmp0_marker)
-                    return@InlineLinearA
-                  }
-                  Text("After return", %composer, 0b0110)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                Text("After inner", %composer, 0b0110)
-                %composer.endReplaceableGroup()
-              }, %composer, 0)
-              Text("Before outer", %composer, 0b0110)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
@@ -1465,7 +578,7 @@
     }
 
     @Test // regression 255350755
-    fun testEnsureRuntimeTestWillCompile_CG() = verifyComposeIrTransform(
+    fun testEnsureRuntimeTestWillCompile_CG() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -1481,50 +594,6 @@
             }
 
         """,
-        """
-            @Composable
-            fun test_CM1_RetFun(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(test_CM1_RetFun)<Text("...>,<M1>,<Text("...>:Test.kt")
-              val tmp0_marker = %composer.currentMarker
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Text("Root - before", %composer, 0b0110)
-                M1({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
-                  Text("M1 - before", %composer, 0b0110)
-                  if (condition) {
-                    %composer.endToMarker(tmp0_marker)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %composer@test_CM1_RetFun.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                      test_CM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                    return
-                  }
-                  Text("M1 - after", %composer, 0b0110)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                Text("Root - after", %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                test_CM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         extra = """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
@@ -1558,36 +627,6 @@
                     NA()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (%composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "<B(a)>")
-              val tmp0_group = B(a, %composer, 0)
-              %composer.endReplaceableGroup()
-              tmp0_group) {
-                NA()
-              } else if (%composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "<B(b)>")
-              val tmp1_group = B(b, %composer, 0)
-              %composer.endReplaceableGroup()
-              tmp1_group) {
-                NA()
-              } else {
-                NA()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1603,33 +642,6 @@
                     else -> x
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0_subject = x
-              when {
-                tmp0_subject == 0 -> {
-                  8
-                }
-                tmp0_subject == 0b0001 -> {
-                  10
-                }
-                else -> {
-                  x
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1647,42 +659,6 @@
                     else -> A(c)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0_subject = x
-              when {
-                tmp0_subject == 0 -> {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<A(a)>")
-                  A(a, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-                tmp0_subject == 0b0001 -> {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<A(b)>")
-                  A(b, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-                else -> {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<A(c)>")
-                  A(c, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1700,47 +676,6 @@
                     else -> R(c)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val y = <block>{
-                val tmp0_subject = x
-                when {
-                  tmp0_subject == 0 -> {
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "<R(a)>")
-                    val tmp0_group = R(a, %composer, 0)
-                    %composer.endReplaceableGroup()
-                    tmp0_group
-                  }
-                  tmp0_subject == 0b0001 -> {
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "<R(b)>")
-                    val tmp1_group = R(b, %composer, 0)
-                    %composer.endReplaceableGroup()
-                    tmp1_group
-                  }
-                  else -> {
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "<R(c)>")
-                    val tmp2_group = R(c, %composer, 0)
-                    %composer.endReplaceableGroup()
-                    tmp2_group
-                  }
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1758,41 +693,6 @@
                     else -> A(c)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              when {
-                x < 0 -> {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<A(a)>")
-                  A(a, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-                x > 30 -> {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<A(b)>")
-                  A(b, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-                else -> {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<A(c)>")
-                  A(c, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1810,40 +710,6 @@
                     else -> A(b)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              when {
-                x < 0 -> {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<A(a)>")
-                  A(a, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-                x > 30 -> {
-                  %composer.startReplaceableGroup(<>)
-                  %composer.endReplaceableGroup()
-                  NA()
-                }
-                else -> {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<A(b)>")
-                  A(b, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1862,40 +728,6 @@
                     else -> NA()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              when {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<R(a)>")
-                val tmp0_group = x == R(a, %composer, 0)
-                %composer.endReplaceableGroup()
-                tmp0_group -> {
-                  NA()
-                }
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<R(b)>")
-                val tmp1_group = x > R(b, %composer, 0)
-                %composer.endReplaceableGroup()
-                tmp1_group -> {
-                  NA()
-                }
-                else -> {
-                  NA()
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1914,44 +746,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "")
-              when {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<R(a)>")
-                val tmp0_group = x == R(a, %composer, 0)
-                %composer.endReplaceableGroup()
-                tmp0_group -> {
-                  NA()
-                }
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<R(b)>")
-                val tmp1_group = x > R(b, %composer, 0)
-                %composer.endReplaceableGroup()
-                tmp1_group -> {
-                  NA()
-                }
-                else -> {
-                  NA()
-                }
-              }
-              %composer.endReplaceableGroup()
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1965,22 +759,6 @@
                 // around the whole expression.
                 x?.A()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int?, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              x?.A(%composer, 0b1110 and %changed)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -1994,33 +772,6 @@
                 // around the whole expression.
                 val y = x ?: R()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int?, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<R()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val y = <block>{
-                val <elvis> = x
-                val tmp0_group = when {
-                  <elvis> == null -> {
-                    R(%composer, 0)
-                  }
-                  else -> {
-                    <elvis>
-                  }
-                }
-                tmp0_group
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2036,26 +787,6 @@
                     P(i)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val <iterator> = items.iterator()
-              while (<iterator>.hasNext()) {
-                val i = <iterator>.next()
-                P(i, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2071,30 +802,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<P(i)>")
-              val <iterator> = items.iterator()
-              while (<iterator>.hasNext()) {
-                val i = <iterator>.next()
-                P(i, %composer, 0)
-              }
-              %composer.endReplaceableGroup()
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2109,26 +816,6 @@
                     print(i)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<L()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val <iterator> = L(%composer, 0).iterator()
-              while (<iterator>.hasNext()) {
-                val i = <iterator>.next()
-                print(i)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2146,25 +833,6 @@
                     P(item)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: MutableList<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<P(item...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.isNotEmpty()) {
-                val item = items.removeAt(items.size - 1)
-                P(item, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2182,29 +850,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: MutableList<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<P(item...>")
-              while (items.isNotEmpty()) {
-                val item = items.removeAt(items.size - 1)
-                P(item, %composer, 0)
-              }
-              %composer.endReplaceableGroup()
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2220,24 +865,6 @@
                     print("hello world")
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<B()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (B(%composer, 0)) {
-                print("hello world")
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2253,28 +880,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<B()>")
-              while (B(%composer, 0)) {
-                print("hello world")
-              }
-              %composer.endReplaceableGroup()
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2290,24 +895,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<B()>,<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (B(%composer, 0)) {
-                A(%composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2324,28 +911,6 @@
                 }
                 A(b)
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<B()>,<A(a)>")
-              while (B(%composer, 0)) {
-                A(a, %composer, 0)
-              }
-              %composer.endReplaceableGroup()
-              A(b, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2361,30 +926,6 @@
                 }
                 print("hello")
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                return
-              }
-              print("hello")
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2399,29 +940,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                return
-              }
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2436,32 +954,6 @@
                 }
                 return 2
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                A(%composer, 0)
-                val tmp1_return = 1
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                return tmp1_return
-              }
-              val tmp0 = 2
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -2476,32 +968,6 @@
                 A()
                 return 2
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                val tmp1_return = 1
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                return tmp1_return
-              }
-              A(%composer, 0)
-              val tmp0 = 2
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -2515,24 +981,6 @@
                 A()
                 return R()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>,<R()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              A(%composer, 0)
-              val tmp0 = R(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -2546,35 +994,6 @@
                 }
                 return R()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<R()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "<R()>")
-              if (x > 0) {
-                val tmp1_return = R(%composer, 0)
-                %composer.endReplaceableGroup()
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                return tmp1_return
-              }
-              %composer.endReplaceableGroup()
-              val tmp0 = R(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -2598,45 +1017,6 @@
                     P(l)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<P(i)>,<P(l)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.hasNext()) {
-                val i = items.next()
-                val j = i
-                val k = i
-                val l = i
-                P(i, %composer, 0)
-                if (i == 0) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<P(j)>")
-                  P(j, %composer, 0)
-                  %composer.endReplaceableGroup()
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                  return
-                } else {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<P(k)>")
-                  P(k, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-                P(l, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2660,48 +1040,6 @@
                     P(l)
                 }
             }
-        """,
-        """
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)*<P(i)>,<P(l)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.hasNext()) {
-                val i = items.next()
-                val j = i
-                val k = i
-                val l = i
-                P(i, %composer, 0)
-                if (i == 0) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<P(j)>")
-                  P(j, %composer, 0)
-                  %composer.endReplaceableGroup()
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    Example(items, %composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                  return
-                } else {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<P(k)>")
-                  P(k, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }
-                P(l, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(items, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -2718,28 +1056,6 @@
                     P(i)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.hasNext()) {
-                val i = items.next()
-                if (i == 0) {
-                  break
-                }
-                P(i, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2756,28 +1072,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.hasNext()) {
-                val i = items.next()
-                P(i, %composer, 0)
-                if (i == 0) {
-                  break
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2797,30 +1091,6 @@
                     P(j)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<P(i)>,<P(j)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.hasNext()) {
-                val i = items.next()
-                val j = i
-                P(i, %composer, 0)
-                if (i == 0) {
-                  break
-                }
-                P(j, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2840,33 +1110,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<P(i)>,<P(i)>")
-              while (items.hasNext()) {
-                val i = items.next()
-                P(i, %composer, 0)
-                if (i == 0) {
-                  break
-                }
-                P(i, %composer, 0)
-              }
-              %composer.endReplaceableGroup()
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2883,32 +1126,6 @@
                     P(i)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.hasNext()) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<P(i)>")
-                val i = items.next()
-                if (i == 0) {
-                  %composer.endReplaceableGroup()
-                  continue
-                }
-                P(i, %composer, 0)
-                %composer.endReplaceableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2926,33 +1143,6 @@
                     print(i)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.hasNext()) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<P(i)>")
-                val i = items.next()
-                P(i, %composer, 0)
-                if (i == 0) {
-                  %composer.endReplaceableGroup()
-                  continue
-                }
-                print(i)
-                %composer.endReplaceableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -2970,33 +1160,6 @@
                     P(i)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (items.hasNext()) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<P(i)>,<P(i)>")
-                val i = items.next()
-                P(i, %composer, 0)
-                if (i == 0) {
-                  %composer.endReplaceableGroup()
-                  continue
-                }
-                P(i, %composer, 0)
-                %composer.endReplaceableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3013,32 +1176,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (a.hasNext()) {
-                val x = a.next()
-                if (x > 100) {
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                  return
-                }
-                A(%composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3059,36 +1196,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              a@while (a.hasNext()) {
-                val x = a.next()
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "*<A()>")
-                b@while (b.hasNext()) {
-                  val y = b.next()
-                  if (y == x) {
-                    %composer.endReplaceableGroup()
-                    break@a
-                  }
-                  A(%composer, 0)
-                }
-                %composer.endReplaceableGroup()
-                A(%composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3118,50 +1225,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              a@while (a.hasNext()) {
-                val x = a.next()
-                if (x == 0) {
-                  break${if (useFir) "@a" else ""}
-                }
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "*<A()>")
-                b@while (b.hasNext()) {
-                  val y = b.next()
-                  if (y == 0) {
-                    break${if (useFir) "@b" else ""}
-                  }
-                  if (y == x) {
-                    %composer.endReplaceableGroup()
-                    break@a
-                  }
-                  if (y > 100) {
-                    %composer.endReplaceableGroup()
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %composer.endReplaceableGroup()
-                    return
-                  }
-                  A(%composer, 0)
-                }
-                %composer.endReplaceableGroup()
-                A(%composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3178,34 +1241,6 @@
                 }
                 A()
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<A()>")
-              a@while (a.hasNext()) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "*<A()>")
-                b@while (b.hasNext()) {
-                  A(%composer, 0)
-                }
-                %composer.endReplaceableGroup()
-                A(%composer, 0)
-              }
-              %composer.endReplaceableGroup()
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3221,30 +1256,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "*<A()>")
-                while (x > 0) {
-                  A(%composer, 0)
-                }
-                %composer.endReplaceableGroup()
-                A(%composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3260,27 +1271,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>,*<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                A(%composer, 0)
-                while (x > 0) {
-                  A(%composer, 0)
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3295,26 +1285,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                while (x > 0) {
-                  A(%composer, 0)
-                }
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3329,27 +1299,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (x > 0) {
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<A()>")
-                A(%composer, 0)
-                %composer.endMovableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3367,31 +1316,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (x > 0) {
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<A(a)>")
-                A(a, %composer, 0)
-                %composer.endMovableGroup()
-                %composer.startMovableGroup(<>, x + 1)
-                sourceInformation(%composer, "<A(b)>")
-                A(b, %composer, 0)
-                %composer.endMovableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3407,28 +1331,6 @@
                     A(b)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<A(b)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (x > 0) {
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<A(a)>")
-                A(a, %composer, 0)
-                %composer.endMovableGroup()
-                A(b, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3444,28 +1346,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<A(a)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (x > 0) {
-                A(a, %composer, 0)
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<A(b)>")
-                A(b, %composer, 0)
-                %composer.endMovableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3482,29 +1362,6 @@
                     A(c)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<A(a)>,<A(c)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (x > 0) {
-                A(a, %composer, 0)
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<A(b)>")
-                A(b, %composer, 0)
-                %composer.endMovableGroup()
-                A(c, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3517,25 +1374,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startMovableGroup(<>, x)
-              sourceInformation(%composer, "<A()>")
-              A(%composer, 0)
-              %composer.endMovableGroup()
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3549,26 +1387,6 @@
                 }
                 A(b)
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startMovableGroup(<>, x)
-              sourceInformation(%composer, "<A(a)>")
-              A(a, %composer, 0)
-              %composer.endMovableGroup()
-              A(b, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3582,26 +1400,6 @@
                     A(b)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A(a)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              A(a, %composer, 0)
-              %composer.startMovableGroup(<>, x)
-              sourceInformation(%composer, "<A(b)>")
-              A(b, %composer, 0)
-              %composer.endMovableGroup()
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3616,27 +1414,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<A()>")
-                A(%composer, 0)
-                %composer.endMovableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3652,28 +1429,6 @@
                     A(b)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<A(a)>")
-                A(a, %composer, 0)
-                %composer.endMovableGroup()
-                A(b, %composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3689,28 +1444,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<A(a)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (x > 0) {
-                A(a, %composer, 0)
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<A(b)>")
-                A(b, %composer, 0)
-                %composer.endMovableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3723,25 +1456,6 @@
                     A()
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(a: Int, b: Int, c: Int, d: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startMovableGroup(<>, %composer.joinKey(%composer.joinKey(%composer.joinKey(a, b), c), d))
-              sourceInformation(%composer, "<A()>")
-              A(%composer, 0)
-              %composer.endMovableGroup()
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3756,27 +1470,6 @@
                     }
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)*<R()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              while (x > 0) {
-                %composer.startMovableGroup(<>, R(%composer, 0))
-                sourceInformation(%composer, "<A()>")
-                A(%composer, 0)
-                %composer.endMovableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3788,29 +1481,6 @@
                 val y = key(x) { R() }
                 P(y)
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<P(y)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val y = <block>{
-                %composer.startMovableGroup(<>, x)
-                sourceInformation(%composer, "<R()>")
-                val tmp0 = R(%composer, 0)
-                %composer.endMovableGroup()
-                tmp0
-              }
-              P(y, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -3825,39 +1495,6 @@
                     else 3
                 } else 4
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0 = <block>{
-                val tmp4_group = if (x > 0) {
-                  val tmp3_group = if (%composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<B()>")
-                  val tmp1_group = B(%composer, 0)
-                  %composer.endReplaceableGroup()
-                  tmp1_group) 1 else if (%composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<B()>")
-                  val tmp2_group = B(%composer, 0)
-                  %composer.endReplaceableGroup()
-                  tmp2_group) 2 else 3
-                  tmp3_group
-                } else {
-                  4
-                }
-                tmp4_group
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -3905,87 +1542,6 @@
                 A()
               }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Simple(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Simple)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<A()>")
-              run {
-                A(%composer, 0)
-              }
-              %composer.endReplaceableGroup()
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-            @NonRestartableComposable
-            @Composable
-            fun WithReturn(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(WithReturn)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<A()>")
-              run {
-                A(%composer, 0)
-                %composer.endReplaceableGroup()
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                return
-              }
-              %composer.endReplaceableGroup()
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-            @NonRestartableComposable
-            @Composable
-            fun NoCalls(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(NoCalls)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              run {
-                println("hello world")
-              }
-              A(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-            @NonRestartableComposable
-            @Composable
-            fun NoCallsAfter(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(NoCallsAfter)*<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              run {
-                A(%composer, 0)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -4002,52 +1558,6 @@
               }
               A(c)
             }
-        """,
-        """
-            @Composable
-            fun Example(x: Int?, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<A(c)>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val tmp0_safe_receiver = x
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "*<A(b)>")
-                val tmp0_group = when {
-                  tmp0_safe_receiver == null -> {
-                    null
-                  }
-                  else -> {
-                    tmp0_safe_receiver.let { it: Int ->
-                      %composer.startReplaceableGroup(<>)
-                      sourceInformation(%composer, "<A(a)>")
-                      if (it > 0) {
-                        A(a, %composer, 0)
-                      }
-                      %composer.endReplaceableGroup()
-                      A(b, %composer, 0)
-                    }
-                  }
-                }
-                %composer.endReplaceableGroup()
-                tmp0_group
-                A(c, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -4064,37 +1574,6 @@
               }
               A()
             }
-        """,
-        """
-            @Composable
-            fun Example(x: Int?, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                x?.let { it: Int ->
-                  if (it > 0) {
-                    NA()
-                  }
-                  NA()
-                }
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -4109,28 +1588,6 @@
             fun <T> provided(value: T): State<T> = remember { mutableStateOf(value) }.apply {
                 this.value = value
             }
-        """,
-        """
-            @Composable
-            fun <T> provided(value: T, %composer: Composer?, %changed: Int): State<T> {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(provided)*<rememb...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0 = remember({
-                mutableStateOf(
-                  value = value
-                )
-              }, %composer, 0).apply {
-                %this%apply.value = value
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -4148,29 +1605,6 @@
                     123
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0 = <block>{
-                val tmp1_group = x.let { it: Int ->
-                  A(%composer, 0)
-                  val tmp0_return = 123
-                  tmp0_return
-                }
-                tmp1_group
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -4183,43 +1617,6 @@
                 A()
               }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<W>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<A()>:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  A(%composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -4232,36 +1629,11 @@
                 A()
               }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<IW>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                IW({ %composer: Composer?, %changed: Int ->
-                  sourceInformationMarkerStart(%composer, <>, "C<A()>:Test.kt")
-                  A(%composer, 0)
-                  sourceInformationMarkerEnd(%composer)
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun testRepeatedCallsToEffects(): Unit = verifyComposeIrTransform(
+    fun testRepeatedCallsToEffects(): Unit = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -4276,53 +1648,6 @@
             }
         """,
         """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Wrap>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Wrap(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<effect>:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "*<effect>")
-                  repeat(number) { it: Int ->
-                    effects[it] = effect({
-                      0
-                    }, %composer, 0b0110)
-                  }
-                  %composer.endReplaceableGroup()
-                  outside = effect({
-                    "0"
-                  }, %composer, 0b0110)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
 
             var effects = mutableListOf<Any>()
@@ -4343,32 +1668,6 @@
                 used(value)
                 A()
             }
-        """,
-        """
-            @Composable
-            fun Test(value: InlineClass, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)P(0:InlineClass)<A()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(value))) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(value)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(value, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -4519,853 +1818,11 @@
                 used(p2)
                 used(p3)
             }
-        """,
-        """
-            @Composable
-            fun Test01(p0: Int, p1: Int, p2: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test01):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test01(p0, p1, p2, p3, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test02(p0: Int, p1: Int, p3: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test02)P(!2,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test02(p0, p1, p3, p2, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test03(p0: Int, p2: Int, p1: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test03)P(!1,2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test03(p0, p2, p1, p3, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test04(p0: Int, p2: Int, p3: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test04)P(!1,2,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test04(p0, p2, p3, p1, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test05(p0: Int, p3: Int, p1: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test05)P(!1,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test05(p0, p3, p1, p2, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test06(p0: Int, p3: Int, p2: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test06)P(!1,3,2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test06(p0, p3, p2, p1, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test07(p1: Int, p0: Int, p2: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test07)P(1):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test07(p1, p0, p2, p3, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test08(p1: Int, p0: Int, p3: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test08)P(1!1,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test08(p1, p0, p3, p2, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test09(p1: Int, p2: Int, p0: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test09)P(1,2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test09(p1, p2, p0, p3, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test00(p1: Int, p2: Int, p3: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test00)P(1,2,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test00(p1, p2, p3, p0, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test11(p1: Int, p3: Int, p0: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test11)P(1,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test11(p1, p3, p0, p2, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test12(p1: Int, p3: Int, p2: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test12)P(1,3,2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test12(p1, p3, p2, p0, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test13(p2: Int, p0: Int, p1: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test13)P(2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test13(p2, p0, p1, p3, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test14(p2: Int, p0: Int, p3: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test14)P(2!1,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test14(p2, p0, p3, p1, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test15(p2: Int, p1: Int, p0: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test15)P(2,1):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test15(p2, p1, p0, p3, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test16(p2: Int, p1: Int, p3: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test16)P(2,1,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test16(p2, p1, p3, p0, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test17(p2: Int, p3: Int, p0: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test17)P(2,3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test17(p2, p3, p0, p1, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test18(p2: Int, p3: Int, p1: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test18)P(2,3,1):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test18(p2, p3, p1, p0, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test19(p3: Int, p0: Int, p1: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test19)P(3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test19(p3, p0, p1, p2, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test20(p3: Int, p0: Int, p2: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test20)P(3!1,2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test20(p3, p0, p2, p1, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test21(p3: Int, p1: Int, p0: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test21)P(3,1):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test21(p3, p1, p0, p2, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test22(p3: Int, p1: Int, p2: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test22)P(3,1,2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test22(p3, p1, p2, p0, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test23(p3: Int, p2: Int, p0: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test23)P(3,2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test23(p3, p2, p0, p1, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test24(p3: Int, p2: Int, p1: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test24)P(3,2,1):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(p0)
-                used(p1)
-                used(p2)
-                used(p3)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test24(p3, p2, p1, p0, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun testSourceInformationWithPackageName(): Unit = verifyComposeIrTransform(
+    fun testSourceInformationWithPackageName(): Unit = verifyGoldenComposeIrTransform(
         source = """
             package androidx.compose.runtime.tests
 
@@ -5382,36 +1839,11 @@
             inline class LocalInlineClass(val value: Int)
             fun used(x: Any?) {}
         """,
-        expectedTransformed = """
-            @Composable
-            fun Test(value: LocalInlineClass, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)P(0:c#runtime.tests.LocalInlineClass):Test.kt#992ot2")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(value))) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, "androidx.compose.runtime.tests.Test (Test.kt:6)")
-                }
-                used(value)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(value, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
     )
 
     @Test
-    fun testSourceOffsetOrderForParameterExpressions(): Unit = verifyComposeIrTransform(
+    fun testSourceOffsetOrderForParameterExpressions(): Unit = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.Composable
 
@@ -5430,33 +1862,11 @@
             @Composable fun c(): Int = 1
             @Composable fun d(): Int = 1
         """,
-        expectedTransformed = """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<b()>,<c()>,<d()>,<A(b(),>,<B()>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, "Test (Test.kt:4)")
-                }
-                A(b(%composer, 0), c(%composer, 0), d(%composer, 0), %composer, 0)
-                B(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
     )
 
     @Test
-    fun testSourceLocationOfCapturingComposableLambdas(): Unit = verifyComposeIrTransform(
+    fun testSourceLocationOfCapturingComposableLambdas(): Unit = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.Composable
 
@@ -5484,55 +1894,11 @@
             fun setContent(block: @Composable () -> Unit) { }
             @Composable fun B(value: String) { }
         """,
-        expectedTransformed = """
-            @StabilityInferred(parameters = 0)
-            class SomeClass {
-              var a: String = "Test"
-              fun onCreate() {
-                setContent(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                  sourceInformation(%composer, "C<B(a)>,<B(a)>:Test.kt")
-                  if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, "SomeClass.onCreate.<anonymous> (Test.kt:7)")
-                    }
-                    B(a, %composer, 0)
-                    B(a, %composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                }
-                )
-              }
-              static val %stable: Int = 8
-            }
-            fun Test() {
-              var a = "Test"
-              setContent(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<B(a)>,<B(a)>:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, "Test.<anonymous> (Test.kt:16)")
-                  }
-                  B(a, %composer, 0)
-                  B(a, %composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-              )
-            }
-        """,
         truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
     )
 
     @Test
-    fun testSourceLineInformationForNormalInline(): Unit = verifyComposeIrTransform(
+    fun testSourceLineInformationForNormalInline(): Unit = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.Composable
 
@@ -5556,59 +1922,11 @@
             @Composable inline fun IW(block: @Composable () -> Unit) = block()
             @Composable fun T(value: Int) { }
         """,
-        expectedTransformed = """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<W>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, "Test (Test.kt:4)")
-                }
-                W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<IW>:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, "ComposableSingletons%TestKt.lambda-1.<anonymous> (Test.kt:6)")
-                  }
-                  IW({ %composer: Composer?, %changed: Int ->
-                    sourceInformationMarkerStart(%composer, <>, "C<T(2)>,<T(4)>:Test.kt")
-                    T(2, %composer, 0b0110)
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "*<T(3)>")
-                    repeat(3) { it: Int ->
-                      T(3, %composer, 0b0110)
-                    }
-                    %composer.endReplaceableGroup()
-                    T(4, %composer, 0b0110)
-                    sourceInformationMarkerEnd(%composer)
-                  }, %composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
-        """,
         truncateTracingInfoMode = TruncateTracingInfoMode.KEEP_INFO_STRING
     )
 
     @Test
-    fun testInlineReadOnlySourceLocations() = verifyComposeIrTransform(
+    fun testInlineReadOnlySourceLocations() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.ReadOnlyComposable
@@ -5634,61 +1952,6 @@
             }
         """,
         """
-            val current: Int
-              @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
-              get() {
-                sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, "<get-current> (Test.kt:7)")
-                }
-                val tmp0 = 0
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                sourceInformationMarkerEnd(%composer)
-                return tmp0
-              }
-            @Composable
-            @ReadOnlyComposable
-            fun calculateSometing(%composer: Composer?, %changed: Int): Int {
-              sourceInformationMarkerStart(%composer, <>, "C(calculateSometing):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, "calculateSometing (Test.kt:11)")
-              }
-              val tmp0 = 0
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              sourceInformationMarkerEnd(%composer)
-              return tmp0
-            }
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<curren...>,<calcul...>,<Layout>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, "Test (Test.kt:16)")
-                }
-                val c = <get-current>(%composer, 0)
-                val cl = calculateSometing(%composer, 0)
-                Layout({ %composer: Composer?, %changed: Int ->
-                  sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
-                  Text("%c %cl", %composer, 0)
-                  sourceInformationMarkerEnd(%composer)
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -5701,7 +1964,7 @@
     )
 
     @Test
-    fun testReadOnlyInlineValSourceLocations() = verifyComposeIrTransform(
+    fun testReadOnlyInlineValSourceLocations() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.ReadOnlyComposable
@@ -5739,79 +2002,6 @@
             }
         """,
         """
-            @StabilityInferred(parameters = 0)
-            class CurrentHolder {
-              val current: Int
-                @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
-                get() {
-                  sourceInformationMarkerStart(%composer, <>, "CC:Test.kt")
-                  val tmp0 = 0
-                  sourceInformationMarkerEnd(%composer)
-                  return tmp0
-                }
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class HolderHolder {
-              val _currentHolder: CurrentHolder = CurrentHolder()
-              val current: Int
-                @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
-                get() {
-                  sourceInformationMarkerStart(%composer, <>, "C<curren...>:Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, "HolderHolder.<get-current> (Test.kt:16)")
-                  }
-                  val tmp0 = _currentHolder.<get-current>(%composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  sourceInformationMarkerEnd(%composer)
-                  return tmp0
-                }
-              static val %stable: Int = 0
-            }
-            val holderHolder: HolderHolder = HolderHolder()
-            @Composable
-            @ReadOnlyComposable
-            fun calculateSomething(%composer: Composer?, %changed: Int): Int {
-              sourceInformationMarkerStart(%composer, <>, "C(calculateSomething):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, "calculateSomething (Test.kt:23)")
-              }
-              val tmp0 = 0
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              sourceInformationMarkerEnd(%composer)
-              return tmp0
-            }
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<curren...>,<calcul...>,<Layout>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, "Test (Test.kt:28)")
-                }
-                val c = holderHolder.<get-current>(%composer, 0b0110)
-                val cl = calculateSomething(%composer, 0)
-                Layout({ %composer: Composer?, %changed: Int ->
-                  sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
-                  Text("%c %cl", %composer, 0)
-                  sourceInformationMarkerEnd(%composer)
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
 
             @Composable
@@ -5832,35 +2022,11 @@
                 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 (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (a < 100) {
-                val tmp1_return = 0
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                sourceInformationMarkerEnd(%composer)
-                return tmp1_return
-              }
-              val tmp0 = 1
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              sourceInformationMarkerEnd(%composer)
-              return tmp0
-            }
         """
     )
 
     @Test
-    fun testMultipleNestedInlines() = verifyComposeIrTransform(
+    fun testMultipleNestedInlines() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.Composable
 
@@ -5876,42 +2042,6 @@
                 }
             }
         """,
-        expectedTransformed = """
-            @Composable
-            fun AttemptedToRealizeGroupTwice(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(AttemptedToRealizeGroupTwice)<Wrappe...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Wrapper({ %composer: Composer?, %changed: Int ->
-                  sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "*<Leaf(0...>")
-                  repeat(1) { it: Int ->
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "*<Leaf(0...>")
-                    repeat(1) { it: Int ->
-                      Leaf(0, %composer, 0b0110, 0)
-                    }
-                    %composer.endReplaceableGroup()
-                    Leaf(0, %composer, 0b0110, 0)
-                  }
-                  %composer.endReplaceableGroup()
-                  sourceInformationMarkerEnd(%composer)
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                AttemptedToRealizeGroupTwice(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         extra = """
             import androidx.compose.runtime.Composable
 
@@ -5924,7 +2054,7 @@
     )
 
     @Test // Regression test for 205590513
-    fun testGroupAroundExtensionFunctions() = verifyComposeIrTransform(
+    fun testGroupAroundExtensionFunctions() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -5953,54 +2083,13 @@
 
             @Composable
             fun <T> A.get(block: () -> T) = block()
-        """,
-        expectedTransformed = """
-            @Composable
-            fun Test(start: Int, end: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)P(1)<rememb...>,*<get(bK...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(start)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(end)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val a = remember({
-                  A()
-                }, %composer, 0)
-                val <iterator> = start until end.iterator()
-                while (<iterator>.hasNext()) {
-                  val i = <iterator>.next()
-                  val b = a.get(bKey, %composer, 0b00110110)
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<get(cK...>")
-                  if (i == 0b0010) {
-                    a.get(cKey, %composer, 0b00110110)
-                  }
-                  %composer.endReplaceableGroup()
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(start, end, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     // There are a number of "inline constructors" in the Kotlin standard library for Array types.
     // These are special cases, since normal constructors cannot be inlined.
     @Test
-    fun testInlineArrayConstructor() = verifyComposeIrTransform(
+    fun testInlineArrayConstructor() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -6016,89 +2105,11 @@
                 DoubleArray(n) { remember { it.toDouble() } }
                 BooleanArray(n) { remember { false } }
             }
-        """,
-        """
-            @Composable
-            fun ArrayConstructorTest(n: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(ArrayConstructorTest)<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(n)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Array(n) { it: Int ->
-                  val tmp0_return = remember({
-                    it
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                ByteArray(n) { it: Int ->
-                  val tmp0_return = remember({
-                    it.toByte()
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                CharArray(n) { it: Int ->
-                  val tmp0_return = remember({
-                    it.toChar()
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                ShortArray(n) { it: Int ->
-                  val tmp0_return = remember({
-                    it.toShort()
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                IntArray(n) { it: Int ->
-                  val tmp0_return = remember({
-                    it
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                LongArray(n) { it: Int ->
-                  val tmp0_return = remember({
-                    it.toLong()
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                FloatArray(n) { it: Int ->
-                  val tmp0_return = remember({
-                    it.toFloat()
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                DoubleArray(n) { it: Int ->
-                  val tmp0_return = remember({
-                    it.toDouble()
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                BooleanArray(n) { it: Int ->
-                  val tmp0_return = remember({
-                    false
-                  }, %composer, 0)
-                  tmp0_return
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                ArrayConstructorTest(n, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun testComposeIrSkippingWithDefaultsRelease() = verifyComposeIrTransform(
+    fun testComposeIrSkippingWithDefaultsRelease() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.ui.text.input.TextFieldValue
             import androidx.compose.runtime.*
@@ -6120,61 +2131,11 @@
                     Text("${'$'}keyboardActions2")
                 }
             }
-        """.trimIndent(),
-        """
-            @StabilityInferred(parameters = 0)
-            object Ui {
-              static val %stable: Int = 0
-            }
-            @Composable
-            @ComposableTarget(applier = "androidx.compose.ui.UiComposable")
-            fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(UiTextField)<Column>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(isError)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  isError = false
-                }
-                if (%default and 0b0010 != 0) {
-                  keyboardActions2 = false
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                println("t41 insideFunction %isError")
-                println("t41 insideFunction %keyboardActions2")
-                Column(null, null, null, { %composer: Composer?, %changed: Int ->
-                  sourceInformationMarkerStart(%composer, <>, "C<Text("...>,<Text("...>:Test.kt")
-                  Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
-                  Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
-                  sourceInformationMarkerEnd(%composer)
-                }, %composer, 0, 0b0111)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-        """
+        """.trimIndent()
     )
 
     @Test
-    fun testRememberInConditionalCallArgument() = verifyComposeIrTransform(
+    fun testRememberInConditionalCallArgument() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -6188,48 +2149,11 @@
                     },
                 )
             }
-        """,
-        expectedTransformed = """
-            @Composable
-            private fun Test(param: String?, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Test(>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(param)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Test(<block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "<rememb...>")
-                  val tmp0_group = if (param == null) {
-                    remember({
-                      ""
-                    }, %composer, 0)
-                  } else {
-                    null
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(param, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun testRememberInNestedConditionalCallArgument() = verifyComposeIrTransform(
+    fun testRememberInNestedConditionalCallArgument() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -6249,49 +2173,11 @@
                     },
                 )
             }
-        """,
-        expectedTransformed = """
-            @Composable
-            private fun Test(param: String?, %composer: Composer?, %changed: Int): String? {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)<Test(>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0 = Test(<block>{
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<Test(>")
-                val tmp2_group = if (param == null) {
-                  Test(<block>{
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "<rememb...>")
-                    val tmp1_group = if (param == null) {
-                      remember({
-                        ""
-                      }, %composer, 0)
-                    } else {
-                      null
-                    }
-                    %composer.endReplaceableGroup()
-                    tmp1_group
-                  }, %composer, 0)
-                } else {
-                  null
-                }
-                %composer.endReplaceableGroup()
-                tmp2_group
-              }, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
     @Test
-    fun testInlineLambdaBeforeACall() = verifyComposeIrTransform(
+    fun testInlineLambdaBeforeACall() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -6305,30 +2191,6 @@
                 return Test("AfterInline")
             }
         """,
-        expectedTransformed = """
-            @Composable
-            private fun Test(param: String?, %composer: Composer?, %changed: Int): String? {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)<Test("...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "*<Test("...>")
-              InlineNonComposable {
-                repeat(10) { it: Int ->
-                  Test("InsideInline", %composer, 0b0110)
-                }
-              }
-              %composer.endReplaceableGroup()
-              val tmp0 = Test("AfterInline", %composer, 0b0110)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
@@ -6337,7 +2199,7 @@
     )
 
     @Test
-    fun testInlineLambda_nonLocalReturn() = verifyComposeIrTransform(
+    fun testInlineLambda_nonLocalReturn() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -6350,41 +2212,6 @@
                 }
             }
         """,
-        expectedTransformed = """
-            @Composable
-            private fun Test(param: String?, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Inline...>:Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Inline1({ %composer: Composer?, %changed: Int ->
-                  val tmp0_marker = %composer.currentMarker
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<Inline...>:Test.kt")
-                  Inline2({ %composer: Composer?, %changed: Int ->
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "C:Test.kt")
-                    if (true) {
-                      %composer.endToMarker(tmp0_marker)
-                      return@Inline1
-                    }
-                    %composer.endReplaceableGroup()
-                  }, %composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(param, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
@@ -6400,7 +2227,7 @@
         """
     )
 
-    fun testNothingBody() = verifyComposeIrTransform(
+    fun testNothingBody() = verifyGoldenComposeIrTransform(
         source = """
         import androidx.compose.runtime.*
 
@@ -6421,68 +2248,11 @@
 
         @Composable
         fun Wrapper(content: @Composable () -> Unit) = content()
-        """,
-        expectedTransformed = """
-        val test1: Function2<Composer, Int, Unit> = TODO()
-        @Composable
-        fun Test2(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test2):Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            TODO()
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test2(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        fun Test3(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test3)<Wrappe...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Wrapper(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test3(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        internal object ComposableSingletons%TestKt {
-          val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-            sourceInformation(%composer, "C:Test.kt")
-            if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              TODO()
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            } else {
-              %composer.skipToGroupEnd()
-            }
-          }
-        }
         """
     )
 
     @Test
-    fun testEarlyReturnFromCrossInlinedLambda() = verifyComposeIrTransform(
+    fun testEarlyReturnFromCrossInlinedLambda() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -6499,44 +2269,10 @@
             @Composable
             internal inline fun Dialog(crossinline block: @Composable () -> Unit) {}
         """.trimIndent(),
-        expectedTransformed = """
-           @Composable
-           private fun Test(param: String?, %composer: Composer?, %changed: Int) {
-             %composer = %composer.startRestartGroup(<>)
-             sourceInformation(%composer, "C(Test)<Dialog>:Test.kt")
-             val %dirty = %changed
-             if (%changed and 0b1110 == 0) {
-               %dirty = %dirty or if (%composer.changed(param)) 0b0100 else 0b0010
-             }
-             if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-               if (isTraceInProgress()) {
-                 traceEventStart(<>, %dirty, -1, <>)
-               }
-               Dialog({ %composer: Composer?, %changed: Int ->
-                 sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
-                 %composer.startReplaceableGroup(<>)
-                 sourceInformation(%composer, "<Test(p...>")
-                 if (false) {
-                   Test(param, %composer, 0b1110 and %dirty)
-                 }
-                 %composer.endReplaceableGroup()
-                 sourceInformationMarkerEnd(%composer)
-               }, %composer, 0)
-               if (isTraceInProgress()) {
-                 traceEventEnd()
-               }
-             } else {
-               %composer.skipToGroupEnd()
-             }
-             %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-               Test(param, %composer, updateChangedFlags(%changed or 0b0001))
-             }
-           }
-        """.trimIndent(),
     )
 
     @Test
-    fun testEarlyReturnFromWhenStatement() = verifyComposeIrTransform(
+    fun testEarlyReturnFromWhenStatement() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -6553,53 +2289,6 @@
             import androidx.compose.runtime.*
 
             @Composable fun Text(text: String) {}
-        """,
-        expectedTransformed = """
-            @Composable
-            private fun Test(param: String?, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val state = remember({
-                  mutableStateOf(
-                    value = false
-                  )
-                }, %composer, 0)
-                val tmp0_subject = state.value
-                when {
-                  tmp0_subject == true -> {
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "<Text(t...>")
-                    val tmp0_return = Text("true", %composer, 0b0110)
-                    %composer.endReplaceableGroup()
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                      Test(param, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                    return tmp0_return
-                  }
-                  else -> {
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "<Text(t...>")
-                    Text("false", %composer, 0b0110)
-                    %composer.endReplaceableGroup()
-                  }
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(param, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """.trimIndent(),
+        """
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
index 488933d..6eea795 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
@@ -34,28 +34,6 @@
               A(a)
               A(b)
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A(a, %composer, 0)
-                A(b, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -67,28 +45,6 @@
               A(a)
               A(b)
             }
-        """,
-        """
-            @Composable
-            private fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A(a, %composer, 0)
-                A(b, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-
         """
     )
 
@@ -101,42 +57,6 @@
                 A()
               }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  A(%composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -149,34 +69,11 @@
                 A()
               }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                IW({ %composer: Composer?, %changed: Int ->
-                  A(%composer, 0)
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun verifyEarlyExitFromMultiLevelNestedInlineFunction() = verifyComposeIrTransform(
+    fun verifyEarlyExitFromMultiLevelNestedInlineFunction() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -196,40 +93,6 @@
                 Text("Before outer")
             }
         """,
-        expectedTransformed = """
-            @Composable
-            @NonRestartableComposable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Text("Before outer", %composer, 0b0110)
-              InlineLinearA({ %composer: Composer?, %changed: Int ->
-                val tmp0_marker = %composer.currentMarker
-                %composer.startReplaceableGroup(<>)
-                Text("Before inner", %composer, 0b0110)
-                InlineLinearB({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  Text("Before return", %composer, 0b0110)
-                  if (condition) {
-                    %composer.endToMarker(tmp0_marker)
-                    return@InlineLinearA
-                  }
-                  Text("After return", %composer, 0b0110)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                Text("After inner", %composer, 0b0110)
-                %composer.endReplaceableGroup()
-              }, %composer, 0)
-              Text("Before outer", %composer, 0b0110)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
index 1ca63c7..97fdd6e 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
@@ -25,16 +25,14 @@
         unchecked: String,
         @Language("kotlin")
         checked: String,
-        expectedTransformed: String,
         dumpTree: Boolean = false
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
 
             $checked
         """.trimIndent(),
-        expectedTransformed,
         """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
@@ -59,29 +57,6 @@
                 B()
                 B(2)
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(1)>,<B()>,<B(2)>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A(1, %composer, 0b0110)
-                B(0, %composer, 0, 0b0001)
-                B(2, %composer, 0b0110, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -99,55 +74,6 @@
             fun Test() {
                 Example()
             }
-        """,
-        """
-            @Composable
-            fun Example(foo: Foo, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)P(0:Foo):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(foo))) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  foo = Foo(0)
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                print(foo)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(foo, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Example(<unsafe-coerce>(0), %composer, 0, 0b0001)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -162,28 +88,6 @@
                 A(0, 1, 2)
                 A(a = 0, c = 2)
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(0,>,<A(a>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A(0, 1, 2, 0, 0, %composer, 0b000110110110, 0b00011000)
-                A(0, 0, 2, 0, 0, %composer, 0b000110000110, 0b00011010)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -194,17 +98,6 @@
         """
             inline fun Bar(unused: @Composable () -> Unit = { }) {}
             fun Foo() { Bar() }
-        """,
-        """
-            fun Bar(unused: Function2<Composer, Int, Unit> = { %composer: Composer?, %changed: Int ->
-              sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
-              Unit
-              sourceInformationMarkerEnd(%composer)
-            }
-            ) { }
-            fun Foo() {
-              Bar()
-            }
         """
     )
 
@@ -218,44 +111,6 @@
             fun Test(x: Int = makeInt()) {
                 used(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    x = makeInt()
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(x)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -269,53 +124,6 @@
                 print(a)
                 print(b)
             }
-        """,
-        """
-            @Composable
-            fun A(a: Int, b: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = 0
-                  }
-                  if (%default and 0b0010 != 0) {
-                    b = a + 1
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                print(a)
-                print(b)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -390,309 +198,6 @@
                 used(a29)
                 used(a30)
             }
-        """,
-        """
-            @Composable
-            fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              val %dirty = %changed
-              val %dirty1 = %changed1
-              val %dirty2 = %changed2
-              val %dirty3 = %changed3
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b1000 != 0) {
-                %dirty = %dirty or 0b110000000000
-              } else if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b00010000 != 0) {
-                %dirty = %dirty or 0b0110000000000000
-              } else if (%changed and 0b1110000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b00100000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000
-              } else if (%changed and 0b01110000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b01000000 != 0) {
-                %dirty = %dirty or 0b000110000000000000000000
-              } else if (%changed and 0b001110000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b10000000 != 0) {
-                %dirty = %dirty or 0b110000000000000000000000
-              } else if (%changed and 0b0001110000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b000100000000 != 0) {
-                %dirty = %dirty or 0b0110000000000000000000000000
-              } else if (%changed and 0b1110000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b001000000000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000000000000000
-              } else if (%changed and 0b01110000000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b010000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110
-              } else if (%changed1 and 0b1110 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
-              }
-              if (%default and 0b100000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000
-              } else if (%changed1 and 0b01110000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0001000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b000110000000
-              } else if (%changed1 and 0b001110000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b0010000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b110000000000
-              } else if (%changed1 and 0b0001110000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b0100000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110000000000000
-              } else if (%changed1 and 0b1110000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b1000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000000000000000
-              } else if (%changed1 and 0b01110000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b00010000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b000110000000000000000000
-              } else if (%changed1 and 0b001110000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b00100000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b110000000000000000000000
-              } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b01000000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110000000000000000000000000
-              } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b10000000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000000000000000000000000000
-              } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b000100000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110
-              } else if (%changed2 and 0b1110 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
-              }
-              if (%default and 0b001000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000
-              } else if (%changed2 and 0b01110000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b010000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b000110000000
-              } else if (%changed2 and 0b001110000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b100000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b110000000000
-              } else if (%changed2 and 0b0001110000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b0001000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110000000000000
-              } else if (%changed2 and 0b1110000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b0010000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000000000000000
-              } else if (%changed2 and 0b01110000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b0100000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b000110000000000000000000
-              } else if (%changed2 and 0b001110000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b1000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b110000000000000000000000
-              } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b00010000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110000000000000000000000000
-              } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b00100000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000000000000000000000000000
-              } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b01000000000000000000000000000000 != 0) {
-                %dirty3 = %dirty3 or 0b0110
-              } else if (%changed3 and 0b1110 == 0) {
-                %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  a00 = 0
-                }
-                if (%default and 0b0010 != 0) {
-                  a01 = 0
-                }
-                if (%default and 0b0100 != 0) {
-                  a02 = 0
-                }
-                if (%default and 0b1000 != 0) {
-                  a03 = 0
-                }
-                if (%default and 0b00010000 != 0) {
-                  a04 = 0
-                }
-                if (%default and 0b00100000 != 0) {
-                  a05 = 0
-                }
-                if (%default and 0b01000000 != 0) {
-                  a06 = 0
-                }
-                if (%default and 0b10000000 != 0) {
-                  a07 = 0
-                }
-                if (%default and 0b000100000000 != 0) {
-                  a08 = 0
-                }
-                if (%default and 0b001000000000 != 0) {
-                  a09 = 0
-                }
-                if (%default and 0b010000000000 != 0) {
-                  a10 = 0
-                }
-                if (%default and 0b100000000000 != 0) {
-                  a11 = 0
-                }
-                if (%default and 0b0001000000000000 != 0) {
-                  a12 = 0
-                }
-                if (%default and 0b0010000000000000 != 0) {
-                  a13 = 0
-                }
-                if (%default and 0b0100000000000000 != 0) {
-                  a14 = 0
-                }
-                if (%default and 0b1000000000000000 != 0) {
-                  a15 = 0
-                }
-                if (%default and 0b00010000000000000000 != 0) {
-                  a16 = 0
-                }
-                if (%default and 0b00100000000000000000 != 0) {
-                  a17 = 0
-                }
-                if (%default and 0b01000000000000000000 != 0) {
-                  a18 = 0
-                }
-                if (%default and 0b10000000000000000000 != 0) {
-                  a19 = 0
-                }
-                if (%default and 0b000100000000000000000000 != 0) {
-                  a20 = 0
-                }
-                if (%default and 0b001000000000000000000000 != 0) {
-                  a21 = 0
-                }
-                if (%default and 0b010000000000000000000000 != 0) {
-                  a22 = 0
-                }
-                if (%default and 0b100000000000000000000000 != 0) {
-                  a23 = 0
-                }
-                if (%default and 0b0001000000000000000000000000 != 0) {
-                  a24 = 0
-                }
-                if (%default and 0b0010000000000000000000000000 != 0) {
-                  a25 = 0
-                }
-                if (%default and 0b0100000000000000000000000000 != 0) {
-                  a26 = 0
-                }
-                if (%default and 0b1000000000000000000000000000 != 0) {
-                  a27 = 0
-                }
-                if (%default and 0b00010000000000000000000000000000 != 0) {
-                  a28 = 0
-                }
-                if (%default and 0b00100000000000000000000000000000 != 0) {
-                  a29 = 0
-                }
-                if (%default and 0b01000000000000000000000000000000 != 0) {
-                  a30 = 0
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, %dirty1, <>)
-                }
-                used(a00)
-                used(a01)
-                used(a02)
-                used(a03)
-                used(a04)
-                used(a05)
-                used(a06)
-                used(a07)
-                used(a08)
-                used(a09)
-                used(a10)
-                used(a11)
-                used(a12)
-                used(a13)
-                used(a14)
-                used(a15)
-                used(a16)
-                used(a17)
-                used(a18)
-                used(a19)
-                used(a20)
-                used(a21)
-                used(a22)
-                used(a23)
-                used(a24)
-                used(a25)
-                used(a26)
-                used(a27)
-                used(a28)
-                used(a29)
-                used(a30)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default)
-              }
-            }
         """
     )
 
@@ -769,318 +274,6 @@
                 used(a30)
                 used(a31)
             }
-        """,
-        """
-            @Composable
-            fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, a31: Int, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int, %default1: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              val %dirty = %changed
-              val %dirty1 = %changed1
-              val %dirty2 = %changed2
-              val %dirty3 = %changed3
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b1000 != 0) {
-                %dirty = %dirty or 0b110000000000
-              } else if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b00010000 != 0) {
-                %dirty = %dirty or 0b0110000000000000
-              } else if (%changed and 0b1110000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b00100000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000
-              } else if (%changed and 0b01110000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b01000000 != 0) {
-                %dirty = %dirty or 0b000110000000000000000000
-              } else if (%changed and 0b001110000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b10000000 != 0) {
-                %dirty = %dirty or 0b110000000000000000000000
-              } else if (%changed and 0b0001110000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b000100000000 != 0) {
-                %dirty = %dirty or 0b0110000000000000000000000000
-              } else if (%changed and 0b1110000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b001000000000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000000000000000
-              } else if (%changed and 0b01110000000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b010000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110
-              } else if (%changed1 and 0b1110 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
-              }
-              if (%default and 0b100000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000
-              } else if (%changed1 and 0b01110000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0001000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b000110000000
-              } else if (%changed1 and 0b001110000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b0010000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b110000000000
-              } else if (%changed1 and 0b0001110000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b0100000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110000000000000
-              } else if (%changed1 and 0b1110000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b1000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000000000000000
-              } else if (%changed1 and 0b01110000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b00010000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b000110000000000000000000
-              } else if (%changed1 and 0b001110000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b00100000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b110000000000000000000000
-              } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b01000000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110000000000000000000000000
-              } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b10000000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000000000000000000000000000
-              } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b000100000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110
-              } else if (%changed2 and 0b1110 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
-              }
-              if (%default and 0b001000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000
-              } else if (%changed2 and 0b01110000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b010000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b000110000000
-              } else if (%changed2 and 0b001110000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b100000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b110000000000
-              } else if (%changed2 and 0b0001110000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b0001000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110000000000000
-              } else if (%changed2 and 0b1110000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b0010000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000000000000000
-              } else if (%changed2 and 0b01110000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b0100000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b000110000000000000000000
-              } else if (%changed2 and 0b001110000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b1000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b110000000000000000000000
-              } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b00010000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110000000000000000000000000
-              } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b00100000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000000000000000000000000000
-              } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b01000000000000000000000000000000 != 0) {
-                %dirty3 = %dirty3 or 0b0110
-              } else if (%changed3 and 0b1110 == 0) {
-                %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
-              }
-              if (%default1 and 0b0001 != 0) {
-                %dirty3 = %dirty3 or 0b00110000
-              } else if (%changed3 and 0b01110000 == 0) {
-                %dirty3 = %dirty3 or if (%composer.changed(a31)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  a00 = 0
-                }
-                if (%default and 0b0010 != 0) {
-                  a01 = 0
-                }
-                if (%default and 0b0100 != 0) {
-                  a02 = 0
-                }
-                if (%default and 0b1000 != 0) {
-                  a03 = 0
-                }
-                if (%default and 0b00010000 != 0) {
-                  a04 = 0
-                }
-                if (%default and 0b00100000 != 0) {
-                  a05 = 0
-                }
-                if (%default and 0b01000000 != 0) {
-                  a06 = 0
-                }
-                if (%default and 0b10000000 != 0) {
-                  a07 = 0
-                }
-                if (%default and 0b000100000000 != 0) {
-                  a08 = 0
-                }
-                if (%default and 0b001000000000 != 0) {
-                  a09 = 0
-                }
-                if (%default and 0b010000000000 != 0) {
-                  a10 = 0
-                }
-                if (%default and 0b100000000000 != 0) {
-                  a11 = 0
-                }
-                if (%default and 0b0001000000000000 != 0) {
-                  a12 = 0
-                }
-                if (%default and 0b0010000000000000 != 0) {
-                  a13 = 0
-                }
-                if (%default and 0b0100000000000000 != 0) {
-                  a14 = 0
-                }
-                if (%default and 0b1000000000000000 != 0) {
-                  a15 = 0
-                }
-                if (%default and 0b00010000000000000000 != 0) {
-                  a16 = 0
-                }
-                if (%default and 0b00100000000000000000 != 0) {
-                  a17 = 0
-                }
-                if (%default and 0b01000000000000000000 != 0) {
-                  a18 = 0
-                }
-                if (%default and 0b10000000000000000000 != 0) {
-                  a19 = 0
-                }
-                if (%default and 0b000100000000000000000000 != 0) {
-                  a20 = 0
-                }
-                if (%default and 0b001000000000000000000000 != 0) {
-                  a21 = 0
-                }
-                if (%default and 0b010000000000000000000000 != 0) {
-                  a22 = 0
-                }
-                if (%default and 0b100000000000000000000000 != 0) {
-                  a23 = 0
-                }
-                if (%default and 0b0001000000000000000000000000 != 0) {
-                  a24 = 0
-                }
-                if (%default and 0b0010000000000000000000000000 != 0) {
-                  a25 = 0
-                }
-                if (%default and 0b0100000000000000000000000000 != 0) {
-                  a26 = 0
-                }
-                if (%default and 0b1000000000000000000000000000 != 0) {
-                  a27 = 0
-                }
-                if (%default and 0b00010000000000000000000000000000 != 0) {
-                  a28 = 0
-                }
-                if (%default and 0b00100000000000000000000000000000 != 0) {
-                  a29 = 0
-                }
-                if (%default and 0b01000000000000000000000000000000 != 0) {
-                  a30 = 0
-                }
-                if (%default1 and 0b0001 != 0) {
-                  a31 = 0
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, %dirty1, <>)
-                }
-                used(a00)
-                used(a01)
-                used(a02)
-                used(a03)
-                used(a04)
-                used(a05)
-                used(a06)
-                used(a07)
-                used(a08)
-                used(a09)
-                used(a10)
-                used(a11)
-                used(a12)
-                used(a13)
-                used(a14)
-                used(a15)
-                used(a16)
-                used(a17)
-                used(a18)
-                used(a19)
-                used(a20)
-                used(a21)
-                used(a22)
-                used(a23)
-                used(a24)
-                used(a25)
-                used(a26)
-                used(a27)
-                used(a28)
-                used(a29)
-                used(a30)
-                used(a31)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default, %default1)
-              }
-            }
         """
     )
 
@@ -1158,328 +351,6 @@
                 used(a30)
                 used(a31)
             }
-        """,
-        """
-            @Composable
-            fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Foo?, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, a31: Foo?, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int, %default1: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              val %dirty = %changed
-              val %dirty1 = %changed1
-              val %dirty2 = %changed2
-              val %dirty3 = %changed3
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b1000 != 0) {
-                %dirty = %dirty or 0b110000000000
-              } else if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b00010000 != 0) {
-                %dirty = %dirty or 0b0110000000000000
-              } else if (%changed and 0b1110000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b00100000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000
-              } else if (%changed and 0b01110000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b01000000 != 0) {
-                %dirty = %dirty or 0b000110000000000000000000
-              } else if (%changed and 0b001110000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b10000000 != 0) {
-                %dirty = %dirty or 0b110000000000000000000000
-              } else if (%changed and 0b0001110000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b000100000000 != 0) {
-                %dirty = %dirty or 0b0110000000000000000000000000
-              } else if (%changed and 0b1110000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%changed and 0b01110000000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%default and 0b001000000000 == 0 && %composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b010000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110
-              } else if (%changed1 and 0b1110 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
-              }
-              if (%default and 0b100000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000
-              } else if (%changed1 and 0b01110000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0001000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b000110000000
-              } else if (%changed1 and 0b001110000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b0010000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b110000000000
-              } else if (%changed1 and 0b0001110000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b0100000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110000000000000
-              } else if (%changed1 and 0b1110000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b1000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000000000000000
-              } else if (%changed1 and 0b01110000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b00010000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b000110000000000000000000
-              } else if (%changed1 and 0b001110000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b00100000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b110000000000000000000000
-              } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b01000000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110000000000000000000000000
-              } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b10000000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000000000000000000000000000
-              } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b000100000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110
-              } else if (%changed2 and 0b1110 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
-              }
-              if (%default and 0b001000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000
-              } else if (%changed2 and 0b01110000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b010000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b000110000000
-              } else if (%changed2 and 0b001110000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b100000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b110000000000
-              } else if (%changed2 and 0b0001110000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b0001000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110000000000000
-              } else if (%changed2 and 0b1110000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b0010000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000000000000000
-              } else if (%changed2 and 0b01110000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b0100000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b000110000000000000000000
-              } else if (%changed2 and 0b001110000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b1000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b110000000000000000000000
-              } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b00010000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b0110000000000000000000000000
-              } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b00100000000000000000000000000000 != 0) {
-                %dirty2 = %dirty2 or 0b00110000000000000000000000000000
-              } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
-                %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b01000000000000000000000000000000 != 0) {
-                %dirty3 = %dirty3 or 0b0110
-              } else if (%changed3 and 0b1110 == 0) {
-                %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
-              }
-              if (%changed3 and 0b01110000 == 0) {
-                %dirty3 = %dirty3 or if (%default1 and 0b0001 == 0 && %composer.changed(a31)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a00 = 0
-                  }
-                  if (%default and 0b0010 != 0) {
-                    a01 = 0
-                  }
-                  if (%default and 0b0100 != 0) {
-                    a02 = 0
-                  }
-                  if (%default and 0b1000 != 0) {
-                    a03 = 0
-                  }
-                  if (%default and 0b00010000 != 0) {
-                    a04 = 0
-                  }
-                  if (%default and 0b00100000 != 0) {
-                    a05 = 0
-                  }
-                  if (%default and 0b01000000 != 0) {
-                    a06 = 0
-                  }
-                  if (%default and 0b10000000 != 0) {
-                    a07 = 0
-                  }
-                  if (%default and 0b000100000000 != 0) {
-                    a08 = 0
-                  }
-                  if (%default and 0b001000000000 != 0) {
-                    a09 = Foo()
-                    %dirty = %dirty and 0b01110000000000000000000000000000.inv()
-                  }
-                  if (%default and 0b010000000000 != 0) {
-                    a10 = 0
-                  }
-                  if (%default and 0b100000000000 != 0) {
-                    a11 = 0
-                  }
-                  if (%default and 0b0001000000000000 != 0) {
-                    a12 = 0
-                  }
-                  if (%default and 0b0010000000000000 != 0) {
-                    a13 = 0
-                  }
-                  if (%default and 0b0100000000000000 != 0) {
-                    a14 = 0
-                  }
-                  if (%default and 0b1000000000000000 != 0) {
-                    a15 = 0
-                  }
-                  if (%default and 0b00010000000000000000 != 0) {
-                    a16 = 0
-                  }
-                  if (%default and 0b00100000000000000000 != 0) {
-                    a17 = 0
-                  }
-                  if (%default and 0b01000000000000000000 != 0) {
-                    a18 = 0
-                  }
-                  if (%default and 0b10000000000000000000 != 0) {
-                    a19 = 0
-                  }
-                  if (%default and 0b000100000000000000000000 != 0) {
-                    a20 = 0
-                  }
-                  if (%default and 0b001000000000000000000000 != 0) {
-                    a21 = 0
-                  }
-                  if (%default and 0b010000000000000000000000 != 0) {
-                    a22 = 0
-                  }
-                  if (%default and 0b100000000000000000000000 != 0) {
-                    a23 = 0
-                  }
-                  if (%default and 0b0001000000000000000000000000 != 0) {
-                    a24 = 0
-                  }
-                  if (%default and 0b0010000000000000000000000000 != 0) {
-                    a25 = 0
-                  }
-                  if (%default and 0b0100000000000000000000000000 != 0) {
-                    a26 = 0
-                  }
-                  if (%default and 0b1000000000000000000000000000 != 0) {
-                    a27 = 0
-                  }
-                  if (%default and 0b00010000000000000000000000000000 != 0) {
-                    a28 = 0
-                  }
-                  if (%default and 0b00100000000000000000000000000000 != 0) {
-                    a29 = 0
-                  }
-                  if (%default and 0b01000000000000000000000000000000 != 0) {
-                    a30 = 0
-                  }
-                  if (%default1 and 0b0001 != 0) {
-                    a31 = Foo()
-                    %dirty3 = %dirty3 and 0b01110000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b001000000000 != 0) {
-                    %dirty = %dirty and 0b01110000000000000000000000000000.inv()
-                  }
-                  if (%default1 and 0b0001 != 0) {
-                    %dirty3 = %dirty3 and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, %dirty1, <>)
-                }
-                used(a00)
-                used(a01)
-                used(a02)
-                used(a03)
-                used(a04)
-                used(a05)
-                used(a06)
-                used(a07)
-                used(a08)
-                used(a09)
-                used(a10)
-                used(a11)
-                used(a12)
-                used(a13)
-                used(a14)
-                used(a15)
-                used(a16)
-                used(a17)
-                used(a18)
-                used(a19)
-                used(a20)
-                used(a21)
-                used(a22)
-                used(a23)
-                used(a24)
-                used(a25)
-                used(a26)
-                used(a27)
-                used(a28)
-                used(a29)
-                used(a30)
-                used(a31)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default, %default1)
-              }
-            }
         """
     )
 
@@ -1496,46 +367,6 @@
                     foo()
                 }
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            open class Foo {
-              @NonRestartableComposable
-              @Composable
-              fun foo(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(foo):Test.kt")
-                if (%default and 0b0001 != 0) {
-                  x = 0
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-              }
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class Bar : Foo {
-              @NonRestartableComposable
-              @Composable
-              fun Example(%composer: Composer?, %changed: Int) {
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(Example)<foo()>:Test.kt")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                foo(0, %composer, 0b01110000 and %changed shl 0b0011, 0b0001)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-              }
-              static val %stable: Int = 0
-            }
         """
     )
 
@@ -1572,24 +403,6 @@
                 NoDefault("Some Text")
                 MultipleDefault()
             }
-        """,
         """
-            @NonRestartableComposable
-            @Composable
-            fun Bar(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Bar)<HasDef...>,<NoDefa...>,<Multip...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              HasDefault(null, %composer, 0b00110000, 0b0001)
-              NoDefault("Some Text", %composer, 0b00110110)
-              MultipleDefault(null, 0, %composer, 0b000110000000, 0b0011)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-        """
-        )
+    )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
index de5f04e..b5c7e62 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
@@ -23,7 +23,7 @@
 abstract class FunctionBodySkippingTransformTestsBase(
     useFir: Boolean
 ) : AbstractIrTransformTest(useFir) {
-    protected fun goldenComparisonPropagation(
+    protected fun comparisonPropagation(
         @Language("kotlin")
         unchecked: String,
         @Language("kotlin")
@@ -45,38 +45,13 @@
         """.trimIndent(),
         dumpTree = dumpTree
     )
-
-    protected fun comparisonPropagation(
-        @Language("kotlin")
-        unchecked: String,
-        @Language("kotlin")
-        checked: String,
-        expectedTransformed: String,
-        dumpTree: Boolean = false
-    ) = verifyComposeIrTransform(
-        """
-            import androidx.compose.runtime.Composable
-            import androidx.compose.runtime.NonRestartableComposable
-            import androidx.compose.runtime.ReadOnlyComposable
-
-            $checked
-        """.trimIndent(),
-        expectedTransformed,
-        """
-            import androidx.compose.runtime.Composable
-
-            $unchecked
-            fun used(x: Any?) {}
-        """.trimIndent(),
-        dumpTree = dumpTree
-    )
 }
 
 class FunctionBodySkippingTransformTests(
     useFir: Boolean
 ) : FunctionBodySkippingTransformTestsBase(useFir) {
     @Test
-    fun testIfInLambda(): Unit = goldenComparisonPropagation(
+    fun testIfInLambda(): Unit = comparisonPropagation(
         """
             @Composable fun A(x: Int = 0, y: Int = 0) {}
             @Composable fun Wrap(content: @Composable () -> Unit) {
@@ -117,55 +92,6 @@
                 used(onTextLayout)
                 used(overflow)
             }
-        """,
-        """
-            @Composable
-            fun BasicText(style: TextStyle?, onTextLayout: Function1<TextLayoutResult, Unit>?, overflow: TextOverflow, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(BasicText)P(2!,1:c#ui.text.style.TextOverflow):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(style)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(onTextLayout)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(overflow))) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  style = Companion.Default
-                }
-                if (%default and 0b0010 != 0) {
-                  onTextLayout = { it: TextLayoutResult ->
-                  }
-                }
-                if (%default and 0b0100 != 0) {
-                  overflow = Companion.Clip
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(style)
-                used(onTextLayout)
-                used(overflow)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                BasicText(style, onTextLayout, overflow, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -183,36 +109,6 @@
             ) {
                 used(arrangement)
             }
-        """,
-        """
-            @Composable
-            fun A(arrangement: Vertical?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(arrangement)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  arrangement = Arrangement.Top
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(arrangement)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(arrangement, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -227,53 +123,6 @@
             ) {
                 content()
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun Example(content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<conten...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  content = ComposableSingletons%TestKt.lambda-1
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                content(%composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(content, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -289,40 +138,6 @@
                 used(a)
                 Example { it -> a.compute(it) }
             }
-        """,
-        """
-            fun Example(a: A) {
-              used(a)
-              Example(<block>{
-                class <no name provided> : A {
-                  @Composable
-                  override fun compute(it: Int, %composer: Composer?, %changed: Int) {
-                    %composer = %composer.startRestartGroup(<>)
-                    sourceInformation(%composer, "C(compute)<comput...>:Test.kt")
-                    val %dirty = %changed
-                    if (%changed and 0b1110 == 0) {
-                      %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
-                    }
-                    if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %dirty, -1, <>)
-                      }
-                      a.compute(it, %composer, 0b1110 and %dirty)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                    val tmp0_rcvr = <this>
-                    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                      tmp0_rcvr.compute(it, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                  }
-                }
-                <no name provided>()
-              })
-            }
         """
     )
 
@@ -351,74 +166,6 @@
                     if (condition()) Color.Red else Color.Blue
                 }
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
-            fun Button(colors: ButtonColors, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Button)<getCol...>,<Text("...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(colors)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Text("hello world", null, colors.getColor(%composer, 0b1110 and %dirty), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0b0110, 0, 0b00011111111111111010)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Button(colors, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            @ComposableTarget(applier = "androidx.compose.ui.UiComposable")
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Button>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Button(<block>{
-                  class <no name provided> : ButtonColors {
-                    @Composable
-                    override fun getColor(%composer: Composer?, %changed: Int): Color {
-                      %composer.startReplaceableGroup(<>)
-                      sourceInformation(%composer, "C(getColor)<condit...>:Test.kt")
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, <>)
-                      }
-                      val tmp0 = if (condition(%composer, 0)) {
-                        Companion.Red
-                      } else {
-                        Companion.Blue
-                      }
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                      %composer.endReplaceableGroup()
-                      return tmp0
-                    }
-                  }
-                  <no name provided>()
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -498,128 +245,6 @@
                 content = content
               )
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun RowColumnImpl(orientation: LayoutOrientation, modifier: Modifier?, arrangement: Vertical?, crossAxisAlignment: Horizontal?, crossAxisSize: SizeMode?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(RowColumnImpl)P(5,4!1,2,3)<conten...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(orientation)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(modifier)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(arrangement)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b1000 != 0) {
-                %dirty = %dirty or 0b110000000000
-              } else if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(crossAxisAlignment)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b00010000 != 0) {
-                %dirty = %dirty or 0b0110000000000000
-              } else if (%changed and 0b1110000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(crossAxisSize)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b00100000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000
-              } else if (%changed and 0b01110000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%dirty and 0b01011011011011011011 != 0b00010010010010010010 || !%composer.skipping) {
-                if (%default and 0b0010 != 0) {
-                  modifier = Companion
-                }
-                if (%default and 0b0100 != 0) {
-                  arrangement = Top
-                }
-                if (%default and 0b1000 != 0) {
-                  crossAxisAlignment = Companion.Start
-                }
-                if (%default and 0b00010000 != 0) {
-                  crossAxisSize = SizeMode.Wrap
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(orientation)
-                used(modifier)
-                used(arrangement)
-                used(crossAxisAlignment)
-                used(crossAxisSize)
-                content(%composer, 0b1110 and %dirty shr 0b1111)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                RowColumnImpl(orientation, modifier, arrangement, crossAxisAlignment, crossAxisSize, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun Column(modifier: Modifier?, verticalArrangement: Vertical?, horizontalGravity: Horizontal?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Column)P(2,3,1)<RowCol...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(verticalArrangement)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(horizontalGravity)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b1000 != 0) {
-                %dirty = %dirty or 0b110000000000
-              } else if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  modifier = Companion
-                }
-                if (%default and 0b0010 != 0) {
-                  verticalArrangement = Top
-                }
-                if (%default and 0b0100 != 0) {
-                  horizontalGravity = Companion.Start
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val tmp0_orientation = LayoutOrientation.Vertical
-                val tmp1_crossAxisSize = SizeMode.Wrap
-                RowColumnImpl(tmp0_orientation, modifier, verticalArrangement, horizontalGravity, tmp1_crossAxisSize, content, %composer, 0b0110000000000110 or 0b01110000 and %dirty shl 0b0011 or 0b001110000000 and %dirty shl 0b0011 or 0b0001110000000000 and %dirty shl 0b0011 or 0b01110000000000000000 and %dirty shl 0b0110, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Column(modifier, verticalArrangement, horizontalGravity, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -638,36 +263,6 @@
             fun SimpleBox(modifier: Modifier = Modifier) {
                used(modifier)
             }
-        """,
-        """
-            @Composable
-            fun SimpleBox(modifier: Modifier?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(SimpleBox):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  modifier = Companion
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(modifier)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                SimpleBox(modifier, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -681,44 +276,6 @@
             fun Example(a: Int = newInt()) {
                print(a)
             }
-        """,
-        """
-            @Composable
-            fun Example(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = newInt()
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                print(a)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -735,44 +292,6 @@
                 }
                 Inner()
             }
-        """,
-        """
-            @Composable
-            fun Example(a: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<Inner(...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                @Composable
-                fun Inner(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Inner)<A(a)>:Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  A(a, %composer, 0b1110 and %dirty)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                }
-                Inner(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -794,35 +313,6 @@
                     Call()
                 }
             }
-        """,
-        """
-            @Composable
-            @NonRestartableComposable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example)<Call()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Call(%composer, 0)
-              val <iterator> = 0 .. 1.iterator()
-              while (<iterator>.hasNext()) {
-                val index = <iterator>.next()
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<Call()>,<Call()>")
-                Call(%composer, 0)
-                if (condition()) {
-                  %composer.endReplaceableGroup()
-                  continue
-                }
-                Call(%composer, 0)
-                %composer.endReplaceableGroup()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -847,53 +337,6 @@
                 used(modifier)
                 used(shape)
             }
-        """,
-        """
-            @Composable
-            fun SimpleBox(modifier: Modifier?, shape: Shape?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(SimpleBox):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(shape)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    modifier = Companion
-                  }
-                  if (%default and 0b0010 != 0) {
-                    shape = RectangleShape
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(modifier)
-                used(shape)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                SimpleBox(modifier, shape, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -913,62 +356,6 @@
                 used(modifier)
                 content()
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun SimpleBox(modifier: Modifier?, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(SimpleBox)P(1)<conten...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  modifier = Companion
-                }
-                if (%default and 0b0010 != 0) {
-                  content = ComposableSingletons%TestKt.lambda-1
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(modifier)
-                content(%composer, 0b1110 and %dirty shr 0b0011)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                SimpleBox(modifier, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -986,33 +373,6 @@
                 A(x)
                 B(y)
             }
-        """,
-        """
-            val foo: Function4<Int, Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<A(x)>,<B(y)>:Test.kt")
-                val %dirty = %changed
-                if (%changed and 0b1110 == 0) {
-                  %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-                }
-                if (%changed and 0b01110000 == 0) {
-                  %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
-                }
-                if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %dirty, -1, <>)
-                  }
-                  A(x, %composer, 0b1110 and %dirty)
-                  B(y, %composer, 0b1110 and %dirty shr 0b0011)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -1028,22 +388,6 @@
                 A(x)
                 B(y)
             }
-        """,
-        """
-            val foo: Function4<Int, Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<A(x)>,<B(y)>:Test.kt")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %changed)
-                B(y, %composer, 0b1000)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              }
-            }
         """
     )
 
@@ -1060,69 +404,6 @@
                     val id = object {}
                 }
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun SomeThing(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(SomeThing)<conten...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                content(%composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                SomeThing(content, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<SomeTh...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                SomeThing(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  val id = <block>{
-                    object
-                  }
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -1135,38 +416,6 @@
             fun B(vararg values: Int) {
                 print(values)
             }
-        """,
-        """
-            @Composable
-            fun B(values: IntArray, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt")
-              val %dirty = %changed
-              %composer.startMovableGroup(<>, values.size)
-              val <iterator> = values.iterator()
-              while (<iterator>.hasNext()) {
-                val value = <iterator>.next()
-                %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
-              }
-              %composer.endMovableGroup()
-              if (%dirty and 0b1110 == 0) {
-                %dirty = %dirty or 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                print(values)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(*values, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1181,38 +430,6 @@
             fun B(vararg values: Foo) {
                 print(values)
             }
-        """,
-        """
-            @Composable
-            fun B(values: Array<out Foo>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt")
-              val %dirty = %changed
-              %composer.startMovableGroup(<>, values.size)
-              val <iterator> = values.iterator()
-              while (<iterator>.hasNext()) {
-                val value = <iterator>.next()
-                %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
-              }
-              %composer.endMovableGroup()
-              if (%dirty and 0b1110 == 0) {
-                %dirty = %dirty or 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                print(values)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(*values, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1226,23 +443,6 @@
             fun B(vararg values: Foo) {
                 print(values)
             }
-        """,
-        """
-            @Composable
-            fun B(values: Array<out Foo>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              print(values)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(*values, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1260,49 +460,6 @@
                 print(counter)
              }
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class Foo {
-              var counter: Int = 0
-              @Composable
-              fun A(%composer: Composer?, %changed: Int) {
-                %composer = %composer.startRestartGroup(<>)
-                sourceInformation(%composer, "C(A):Test.kt")
-                if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  print("hello world")
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-                val tmp0_rcvr = <this>
-                %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                  tmp0_rcvr.A(%composer, updateChangedFlags(%changed or 0b0001))
-                }
-              }
-              @Composable
-              fun B(%composer: Composer?, %changed: Int) {
-                %composer = %composer.startRestartGroup(<>)
-                sourceInformation(%composer, "C(B):Test.kt")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                print(counter)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                val tmp0_rcvr = <this>
-                %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                  tmp0_rcvr.B(%composer, updateChangedFlags(%changed or 0b0001))
-                }
-              }
-              static val %stable: Int = 8
-            }
         """
     )
 
@@ -1318,62 +475,6 @@
                 used(b)
                 used(c)
             }
-        """,
-        """
-            @Composable
-            fun Example(a: Int, b: Int, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<makeIn...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = 0
-                  }
-                  if (%default and 0b0010 != 0) {
-                    b = makeInt(%composer, 0)
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                  if (%default and 0b0100 != 0) {
-                    c = 0
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(a)
-                used(b)
-                used(c)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -1394,90 +495,6 @@
                     A(x)
                 }
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun Wrap(y: Int, content: Function3<@[ParameterName(name = 'x')] Int, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Wrap)P(1)<conten...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(y)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                content(y, %composer, 0b1110 and %dirty or 0b01110000 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Wrap(y, content, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Wrap(1...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  x = 0
-                }
-                if (%default and 0b0010 != 0) {
-                  y = 0
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(y)
-                Wrap(10, composableLambda(%composer, <>, true) { it: ${if (useFir) "@[ParameterName(name = 'x')] " else ""}Int, %composer: Composer?, %changed: Int ->
-                  sourceInformation(%composer, "C<A(x)>:Test.kt")
-                  val %dirty = %changed
-                  if (%changed and 0b1110 == 0) {
-                    %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
-                  }
-                  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %dirty, -1, <>)
-                    }
-                    used(it)
-                    A(x, 0, %composer, 0b1110 and %dirty@Test, 0b0010)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                }, %composer, 0b00110110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, y, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -1492,29 +509,6 @@
                 A(x, y)
                 return x + y
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int): Int {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(x,>:Test.kt")
-              if (%default and 0b0001 != 0) {
-                x = 0
-              }
-              if (%default and 0b0010 != 0) {
-                y = 0
-              }
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              A(x, y, %composer, 0b1110 and %changed or 0b01110000 and %changed, 0)
-              val tmp0 = x + y
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -1527,29 +521,6 @@
             val test = @Composable { x: Int ->
                 A(x)
             }
-        """,
-        """
-            val test: Function3<Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function3<Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<A(x)>:Test.kt")
-                val %dirty = %changed
-                if (%changed and 0b1110 == 0) {
-                  %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-                }
-                if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %dirty, -1, <>)
-                  }
-                  A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -1560,22 +531,6 @@
         """,
         """
             @Composable fun Test(x: Int) = A()
-        """,
-        """
-            @Composable
-            fun Test(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test)<A()>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0 = A(0, 0, %composer, 0, 0b0011)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -1588,34 +543,6 @@
             @Composable fun Test(x: Int, y: Int) {
                 A(y = y, x = x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(y>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, y, %composer, 0b1110 and %dirty or 0b01110000 and %dirty, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, y, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1638,89 +565,6 @@
             @Composable fun NoParams() {
                 print("Hello World")
             }
-        """,
-        """
-            @Composable
-            fun CanSkip(a: Int, b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(CanSkip):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00010000
-              }
-              if (%default and 0b0010 != 0b0010 || %dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = 0
-                  }
-                  if (%default and 0b0010 != 0) {
-                    b = Foo()
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(a)
-                used(b)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                CanSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            @Composable
-            fun CannotSkip(a: Int, b: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(CannotSkip):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(a)
-              used(b)
-              print("Hello World")
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                CannotSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun NoParams(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(NoParams):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                print("Hello World")
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                NoParams(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1734,41 +578,6 @@
             @Composable fun Bar.CanSkip(b: Foo = Foo()) {
                 print("Hello World")
             }
-        """,
-        """
-            @Composable
-            fun Bar.CanSkip(b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(CanSkip):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0b0001 || %dirty and 0b0001 != 0 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    b = Foo()
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                print("Hello World")
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                CanSkip(b, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -1782,27 +591,6 @@
             fun Test() {
                 A()
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A()>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1816,31 +604,6 @@
             fun Test(x: Int) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1864,65 +627,6 @@
                 used(text)
                 used(color)
             }
-        """,
-        """
-            @Composable
-            fun A(text: String, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<B(text...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                B(text, <unsafe-coerce>(0), %composer, 0b1110 and %dirty, 0b0010)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(text, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun B(text: String, color: Color, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B)P(1,0:Color):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(color))) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (%default and 0b0010 != 0) {
-                  color = Companion.Unset
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(text)
-                used(color)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(text, color, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -1978,80 +682,6 @@
                 C(Math.random())
                 C(Math.random() / 100f)
             }
-        """,
-        """
-            @Composable
-            fun A(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<D>,<C({})>,<C(stab...>,<C(16.d...>,<C(Dp(1...>,<C(16.d...>,<C(norm...>,<C(Int....>,<C(stab...>,<C(Modi...>,<C(Foo....>,<C(cons...>,<C(123)>,<C(123>,<C(x)>,<C(x>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val x = 123
-                D(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-                C({
-                }, %composer, 0b0110)
-                C(stableFun(123), %composer, 0b0110)
-                C(16.dp + 10.dp, %composer, 0b0110)
-                C(Dp(16), %composer, 0b0110)
-                C(16.dp, %composer, 0b0110)
-                C(normInt, %composer, 0b0110)
-                C(Companion.MAX_VALUE, %composer, 0b0110)
-                C(stableTopLevelProp, %composer, 0b0110)
-                C(Companion, %composer, 0b0110)
-                C(Foo.Bar, %composer, 0b0110)
-                C(${if (!useFir) "constInt" else "123"}, %composer, 0b0110)
-                C(123, %composer, 0b0110)
-                C(${if (!useFir) "123 + 345" else "468"}, %composer, 0b0110)
-                C(x, %composer, 0b0110)
-                C(x * 123, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun B(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(B)<C(Math...>,<C(Math...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                C(random(), %composer, 0)
-                C(random() / 100.0f, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                B(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -2064,43 +694,6 @@
             @Composable fun Example() {
                 D {}
             }
-        """,
-        """
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<D>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                D(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -2114,36 +707,6 @@
             fun Test(x: Int = 0) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  x = 0
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -2158,44 +721,6 @@
             fun Test(x: Int = I()) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<I()>,<A(x)>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    x = I(%composer, 0)
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -2210,23 +735,6 @@
             fun Test(x: Foo) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              A(x, %composer, 0b1000)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -2241,44 +749,6 @@
             fun Test(x: Foo = Foo()) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    x = Foo()
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -2293,68 +763,6 @@
             fun Test(a: Int, b: Boolean, c: Int = 0, d: Foo = Foo(), e: List<Int> = emptyList()) {
                 A(a, b, c, d, e)
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, b: Boolean, c: Int, d: Foo?, e: List<Int>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(a,>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%default and 0b1000 == 0 && %composer.changed(d)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b00010000 != 0) {
-                %dirty = %dirty or 0b0010000000000000
-              }
-              if (%default and 0b00010000 != 0b00010000 || %dirty and 0b1011011011011011 != 0b0010010010010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0100 != 0) {
-                    c = 0
-                  }
-                  if (%default and 0b1000 != 0) {
-                    d = Foo()
-                    %dirty = %dirty and 0b0001110000000000.inv()
-                  }
-                  if (%default and 0b00010000 != 0) {
-                    e = emptyList()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b1000 != 0) {
-                    %dirty = %dirty and 0b0001110000000000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(a, b, c, d, e, %composer, 0b1000000000000000 or 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, b, c, d, e, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -2368,32 +776,6 @@
                 X(x + 1)
                 X(x)
             }
-        """,
-        """
-            @Composable
-            fun X(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(X)<X(x>,<X(x)>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                X(x + 1, %composer, 0)
-                X(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                X(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -2434,27 +816,6 @@
                     print("Hello World")
                 }
             }
-        """,
-        """
-            fun LazyListScope.Example(items: LazyPagingItems<User>) {
-              itemsIndexed(items, ComposableSingletons%TestKt.lambda-1)
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: @[ExtensionFunctionType] Function5<LazyItemScope, Int, User?, Composer, Int, Unit> = composableLambdaInstance(<>, false) { index: Int, user: User?, %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b0001010000000001 != 0b010000000000 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  print("Hello World")
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -2469,49 +830,6 @@
             }
 
             @Composable fun doSomething(x: Unstable) {}
-        """,
-        """
-            @Composable
-            fun Unstable.Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<doSome...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                doSomething(<this>, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun doSomething(x: Unstable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(doSomething):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                doSomething(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -2540,32 +858,6 @@
             inline fun c(foo: Foo, label: String) {
                 print(label)
             }
-        """,
-        """
-            @Composable
-            @ExplicitGroupsComposable
-            fun A(foo: Foo, %composer: Composer?, %changed: Int) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              foo.b(null, %composer, 0b1110 and %changed, 0b0001)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            }
-            @Composable
-            @ExplicitGroupsComposable
-            fun Foo.b(label: String?, %composer: Composer?, %changed: Int, %default: Int) {
-              if (%default and 0b0001 != 0) {
-                label = ""
-              }
-              c(<this>, label, %composer, 0b1110 and %changed or 0b01110000 and %changed)
-            }
-            @Composable
-            @ExplicitGroupsComposable
-            fun c(foo: Foo, label: String, %composer: Composer?, %changed: Int) {
-              print(label)
-            }
         """
     )
 
@@ -2589,31 +881,6 @@
                     fooGlobal
                 )
             }
-        """,
-        """
-            @Composable
-            fun A(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<B(>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                B(x, x + 1, 123, fooGlobal, %composer, 0b110110000000 or 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -2637,78 +904,6 @@
             val stableUsed: @Composable StableFoo.() -> Unit = {
                 used(x)
             }
-        """,
-        """
-            val unstableUnused: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            val unstableUsed: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-2
-            val stableUnused: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-3
-            val stableUsed: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-4
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-              val lambda-2: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                val %dirty = %changed
-                if (%changed and 0b1110 == 0) {
-                  %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
-                }
-                if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %dirty, -1, <>)
-                  }
-                  used(${if (useFir) "x" else "<this>.x"})
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-              val lambda-3: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-              val lambda-4: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                val %dirty = %changed
-                if (%changed and 0b1110 == 0) {
-                  %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
-                }
-                if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %dirty, -1, <>)
-                  }
-                  used(${if (useFir) "x" else "<this>.x"})
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -2729,67 +924,6 @@
                 }
                 B(x)
             }
-        """,
-        """
-            @Composable
-            fun A(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<Provid...>,<B(x)>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Provide(composableLambda(%composer, <>, true) { y: Int, %composer: Composer?, %changed: Int ->
-                  sourceInformation(%composer, "C<Provid...>,<B(x,>:Test.kt")
-                  val %dirty = %changed
-                  if (%changed and 0b1110 == 0) {
-                    %dirty = %dirty or if (%composer.changed(y)) 0b0100 else 0b0010
-                  }
-                  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %dirty, -1, <>)
-                    }
-                    Provide(composableLambda(%composer, <>, true) { z: Int, %composer: Composer?, %changed: Int ->
-                      sourceInformation(%composer, "C<B(x,>:Test.kt")
-                      val %dirty = %changed
-                      if (%changed and 0b1110 == 0) {
-                        %dirty = %dirty or if (%composer.changed(z)) 0b0100 else 0b0010
-                      }
-                      if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                        if (isTraceInProgress()) {
-                          traceEventStart(<>, %dirty, -1, <>)
-                        }
-                        B(x, y, z, %composer, 0b1110 and %dirty@A or 0b01110000 and %dirty@A.<anonymous> shl 0b0011 or 0b001110000000 and %dirty shl 0b0110, 0)
-                        if (isTraceInProgress()) {
-                          traceEventEnd()
-                        }
-                      } else {
-                        %composer.skipToGroupEnd()
-                      }
-                    }, %composer, 0b0110)
-                    B(x, y, 0, %composer, 0b1110 and %dirty@A or 0b01110000 and %dirty shl 0b0011, 0b0100)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                }, %composer, 0b0110)
-                B(x, 0, 0, %composer, 0b1110 and %dirty, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -2806,44 +940,6 @@
                 }
                 foo(x)
             }
-        """,
-        """
-            @Composable
-            fun A(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<foo(x)>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                @Composable
-                fun foo(y: Int, %composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(foo)<B(x,>:Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  B(x, y, %composer, 0b1110 and %dirty or 0b01110000 and %changed shl 0b0011)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                }
-                foo(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -2907,150 +1003,6 @@
                     a00
                 )
             }
-        """,
-        """
-            @Composable
-            fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, %composer: Composer?, %changed: Int, %changed1: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
-              val %dirty = %changed
-              val %dirty1 = %changed1
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b1000 != 0) {
-                %dirty = %dirty or 0b110000000000
-              } else if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b00010000 != 0) {
-                %dirty = %dirty or 0b0110000000000000
-              } else if (%changed and 0b1110000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b00100000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000
-              } else if (%changed and 0b01110000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b01000000 != 0) {
-                %dirty = %dirty or 0b000110000000000000000000
-              } else if (%changed and 0b001110000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b10000000 != 0) {
-                %dirty = %dirty or 0b110000000000000000000000
-              } else if (%changed and 0b0001110000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b000100000000 != 0) {
-                %dirty = %dirty or 0b0110000000000000000000000000
-              } else if (%changed and 0b1110000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b001000000000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000000000000000
-              } else if (%changed and 0b01110000000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b010000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110
-              } else if (%changed1 and 0b1110 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
-              }
-              if (%default and 0b100000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000
-              } else if (%changed1 and 0b01110000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0001000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b000110000000
-              } else if (%changed1 and 0b001110000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b0010000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b110000000000
-              } else if (%changed1 and 0b0001110000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b0100000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110000000000000
-              } else if (%changed1 and 0b1110000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b1011011011011011 != 0b0010010010010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  a00 = 0
-                }
-                if (%default and 0b0010 != 0) {
-                  a01 = 0
-                }
-                if (%default and 0b0100 != 0) {
-                  a02 = 0
-                }
-                if (%default and 0b1000 != 0) {
-                  a03 = 0
-                }
-                if (%default and 0b00010000 != 0) {
-                  a04 = 0
-                }
-                if (%default and 0b00100000 != 0) {
-                  a05 = 0
-                }
-                if (%default and 0b01000000 != 0) {
-                  a06 = 0
-                }
-                if (%default and 0b10000000 != 0) {
-                  a07 = 0
-                }
-                if (%default and 0b000100000000 != 0) {
-                  a08 = 0
-                }
-                if (%default and 0b001000000000 != 0) {
-                  a09 = 0
-                }
-                if (%default and 0b010000000000 != 0) {
-                  a10 = 0
-                }
-                if (%default and 0b100000000000 != 0) {
-                  a11 = 0
-                }
-                if (%default and 0b0001000000000000 != 0) {
-                  a12 = 0
-                }
-                if (%default and 0b0010000000000000 != 0) {
-                  a13 = 0
-                }
-                if (%default and 0b0100000000000000 != 0) {
-                  a14 = 0
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, %dirty1, <>)
-                }
-                Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, %composer, 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty or 0b1110000000000000 and %dirty or 0b01110000000000000000 and %dirty or 0b001110000000000000000000 and %dirty or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty or 0b01110000000000000000000000000000 and %dirty, 0b1110 and %dirty1 or 0b01110000 and %dirty1 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 or 0b1110000000000000 and %dirty1, 0)
-                Example(a14, a13, a12, a11, a10, a09, a08, a07, a06, a05, a04, a03, a02, a01, a00, %composer, 0b1110 and %dirty1 shr 0b1100 or 0b01110000 and %dirty1 shr 0b0110 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 shl 0b0110 or 0b1110000000000000 and %dirty1 shl 0b1100 or 0b01110000000000000000 and %dirty shr 0b1100 or 0b001110000000000000000000 and %dirty shr 0b0110 or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty shl 0b0110 or 0b01110000000000000000000000000000 and %dirty shl 0b1100, 0b1110 and %dirty shr 0b1100 or 0b01110000 and %dirty shr 0b0110 or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty shl 0b0110 or 0b1110000000000000 and %dirty shl 0b1100, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), %default)
-              }
-            }
         """
     )
 
@@ -3117,158 +1069,6 @@
                     a00
                 )
             }
-        """,
-        """
-            @Composable
-            fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, %composer: Composer?, %changed: Int, %changed1: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
-              val %dirty = %changed
-              val %dirty1 = %changed1
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b1000 != 0) {
-                %dirty = %dirty or 0b110000000000
-              } else if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b00010000 != 0) {
-                %dirty = %dirty or 0b0110000000000000
-              } else if (%changed and 0b1110000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b00100000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000
-              } else if (%changed and 0b01110000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%default and 0b01000000 != 0) {
-                %dirty = %dirty or 0b000110000000000000000000
-              } else if (%changed and 0b001110000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
-              }
-              if (%default and 0b10000000 != 0) {
-                %dirty = %dirty or 0b110000000000000000000000
-              } else if (%changed and 0b0001110000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
-              }
-              if (%default and 0b000100000000 != 0) {
-                %dirty = %dirty or 0b0110000000000000000000000000
-              } else if (%changed and 0b1110000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
-              }
-              if (%default and 0b001000000000 != 0) {
-                %dirty = %dirty or 0b00110000000000000000000000000000
-              } else if (%changed and 0b01110000000000000000000000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
-              }
-              if (%default and 0b010000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110
-              } else if (%changed1 and 0b1110 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
-              }
-              if (%default and 0b100000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000
-              } else if (%changed1 and 0b01110000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0001000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b000110000000
-              } else if (%changed1 and 0b001110000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
-              }
-              if (%default and 0b0010000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b110000000000
-              } else if (%changed1 and 0b0001110000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
-              }
-              if (%default and 0b0100000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b0110000000000000
-              } else if (%changed1 and 0b1110000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
-              }
-              if (%default and 0b1000000000000000 != 0) {
-                %dirty1 = %dirty1 or 0b00110000000000000000
-              } else if (%changed1 and 0b01110000000000000000 == 0) {
-                %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
-              }
-              if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011 != 0b00010010010010010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  a00 = 0
-                }
-                if (%default and 0b0010 != 0) {
-                  a01 = 0
-                }
-                if (%default and 0b0100 != 0) {
-                  a02 = 0
-                }
-                if (%default and 0b1000 != 0) {
-                  a03 = 0
-                }
-                if (%default and 0b00010000 != 0) {
-                  a04 = 0
-                }
-                if (%default and 0b00100000 != 0) {
-                  a05 = 0
-                }
-                if (%default and 0b01000000 != 0) {
-                  a06 = 0
-                }
-                if (%default and 0b10000000 != 0) {
-                  a07 = 0
-                }
-                if (%default and 0b000100000000 != 0) {
-                  a08 = 0
-                }
-                if (%default and 0b001000000000 != 0) {
-                  a09 = 0
-                }
-                if (%default and 0b010000000000 != 0) {
-                  a10 = 0
-                }
-                if (%default and 0b100000000000 != 0) {
-                  a11 = 0
-                }
-                if (%default and 0b0001000000000000 != 0) {
-                  a12 = 0
-                }
-                if (%default and 0b0010000000000000 != 0) {
-                  a13 = 0
-                }
-                if (%default and 0b0100000000000000 != 0) {
-                  a14 = 0
-                }
-                if (%default and 0b1000000000000000 != 0) {
-                  a15 = 0
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, %dirty1, <>)
-                }
-                Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, %composer, 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty or 0b1110000000000000 and %dirty or 0b01110000000000000000 and %dirty or 0b001110000000000000000000 and %dirty or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty or 0b01110000000000000000000000000000 and %dirty, 0b1110 and %dirty1 or 0b01110000 and %dirty1 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 or 0b1110000000000000 and %dirty1 or 0b01110000000000000000 and %dirty1, 0)
-                Example(a15, a14, a13, a12, a11, a10, a09, a08, a07, a06, a05, a04, a03, a02, a01, a00, %composer, 0b1110 and %dirty1 shr 0b1111 or 0b01110000 and %dirty1 shr 0b1001 or 0b001110000000 and %dirty1 shr 0b0011 or 0b0001110000000000 and %dirty1 shl 0b0011 or 0b1110000000000000 and %dirty1 shl 0b1001 or 0b01110000000000000000 and %dirty1 shl 0b1111 or 0b001110000000000000000000 and %dirty shr 0b1001 or 0b0001110000000000000000000000 and %dirty shr 0b0011 or 0b1110000000000000000000000000 and %dirty shl 0b0011 or 0b01110000000000000000000000000000 and %dirty shl 0b1001, 0b1110 and %dirty shr 0b1111 or 0b01110000 and %dirty shr 0b1001 or 0b001110000000 and %dirty shr 0b0011 or 0b0001110000000000 and %dirty shl 0b0011 or 0b1110000000000000 and %dirty shl 0b1001 or 0b01110000000000000000 and %dirty shl 0b1111, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), %default)
-              }
-            }
         """
     )
 
@@ -3292,48 +1092,6 @@
             @ReadOnlyComposable
             @Composable
             fun getHashCode(): Int = currentComposer.hashCode()
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            open class Foo {
-              val current: Int
-                @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
-                get() {
-                  sourceInformationMarkerStart(%composer, <>, "CC:Test.kt")
-                  val tmp0 = %composer.hashCode()
-                  sourceInformationMarkerEnd(%composer)
-                  return tmp0
-                }
-              @ReadOnlyComposable
-              @Composable
-              fun getHashCode(%composer: Composer?, %changed: Int): Int {
-                sourceInformationMarkerStart(%composer, <>, "C(getHashCode):Test.kt")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val tmp0 = %composer.hashCode()
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                sourceInformationMarkerEnd(%composer)
-                return tmp0
-              }
-              static val %stable: Int = 0
-            }
-            @ReadOnlyComposable
-            @Composable
-            fun getHashCode(%composer: Composer?, %changed: Int): Int {
-              sourceInformationMarkerStart(%composer, <>, "C(getHashCode):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0 = %composer.hashCode()
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              sourceInformationMarkerEnd(%composer)
-              return tmp0
-            }
         """
     )
 
@@ -3354,53 +1112,6 @@
                 A(wontChange)
                 A(mightChange)
             }
-        """,
-        """
-            @Composable
-            fun Example(wontChange: Int, mightChange: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)P(1)<curren...>,<A(wont...>,<A(migh...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(wontChange)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(mightChange)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    wontChange = 123
-                  }
-                  if (%default and 0b0010 != 0) {
-                    mightChange = LocalColor.<get-current>(%composer, 0b0110)
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(wontChange, %composer, 0b1110 and %dirty)
-                A(mightChange, %composer, 0b1110 and %dirty shr 0b0011)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(wontChange, mightChange, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -3412,32 +1123,6 @@
             @Composable fun Example(content: @Composable() () -> Unit) {
                 content.invoke()
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<invoke...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                content(%composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(content, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -3448,23 +1133,6 @@
         """
             fun A(factory: @Composable () -> Int): Unit {}
             fun B() = A { 123 }
-        """,
-        """
-            fun A(factory: Function2<Composer, Int, Int>) { }
-            fun B() {
-              return A { %composer: Composer?, %changed: Int ->
-                %composer.startReplaceableGroup(<>)
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val tmp0 = 123
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                %composer.endReplaceableGroup()
-                tmp0
-              }
-            }
         """
     )
 
@@ -3486,71 +1154,6 @@
                 used(paddingStart)
                 content()
             }
-        """,
-        """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun Box2(modifier: Modifier?, paddingStart: Dp, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Box2)P(1,2:c#ui.unit.Dp)<conten...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(paddingStart))) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  modifier = Companion
-                }
-                if (%default and 0b0010 != 0) {
-                  paddingStart = Companion.Unspecified
-                }
-                if (%default and 0b0100 != 0) {
-                  content = ComposableSingletons%TestKt.lambda-1
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(modifier)
-                used(paddingStart)
-                content(%composer, 0b1110 and %dirty shr 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Box2(modifier, paddingStart, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -3570,39 +1173,6 @@
                     B()
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(cond: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<B()>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(cond)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "<A()>")
-                if (cond) {
-                  A(%composer, 0)
-                }
-                %composer.endReplaceableGroup()
-                if (cond) {
-                  B(%composer, 0)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(cond, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -3628,87 +1198,6 @@
             }
             @Composable
             fun Skippable3(a: Unstable, b: Stable, c: MaybeStable) { }
-        """,
-        """
-            @Composable
-            fun Unskippable(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Unskippable):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(a)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Unskippable(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Skippable1(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Skippable1):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01010001 != 0b00010000 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(b)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Skippable1(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Skippable2(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Skippable2):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001010000001 != 0b10000000 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(c)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Skippable2(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Skippable3(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Skippable3):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Skippable3(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -3726,60 +1215,6 @@
                 used(this)
                 used(it)
             }
-        """,
-        """
-            @Composable
-            fun MaybeStable.example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(example):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(<this>)
-                used(x)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                example(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            val example: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: Int, %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                val %dirty = %changed
-                if (%changed and 0b1110 == 0) {
-                  %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
-                }
-                if (%changed and 0b01110000 == 0) {
-                  %dirty = %dirty or if (%composer.changed(it)) 0b00100000 else 0b00010000
-                }
-                if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %dirty, -1, <>)
-                  }
-                  used(<this>)
-                  used(it)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
@@ -3794,64 +1229,11 @@
             fun VarargComposable(state: MutableState<Int>, vararg values: String = Array(1) { "value " + it }) {
                 state.value
             }
-        """,
-        """
-            @Composable
-            fun VarargComposable(state: MutableState<Int>, values: Array<out String>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(VarargComposable):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(state)) 0b0100 else 0b0010
-              }
-              %composer.startMovableGroup(<>, values.size)
-              val <iterator> = values.iterator()
-              while (<iterator>.hasNext()) {
-                val value = <iterator>.next()
-                %dirty = %dirty or if (%composer.changed(value)) 0b00100000 else 0
-              }
-              %composer.endMovableGroup()
-              if (%dirty and 0b01110000 == 0) {
-                %dirty = %dirty or 0b00010000
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0010 != 0) {
-                    values = Array(1) { it: Int ->
-                      val tmp0_return = "value " + it
-                      tmp0_return
-                    }
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                state.value
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                VarargComposable(state, *values, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
     @Test // regression test for 204897513
-    fun test_InlineForLoop() = verifyComposeIrTransform(
+    fun test_InlineForLoop() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -3867,43 +1249,6 @@
                 for (item in items) content(item)
             }
         """,
-        expectedTransformed = """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Bug(li...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Bug(listOf(1, 2, 3), { it: ${if (useFir) "@[ParameterName(name = 'item')] " else ""}Int, %composer: Composer?, %changed: Int ->
-                  sourceInformationMarkerStart(%composer, <>, "C<Text(i...>:Test.kt")
-                  Text(it.toString(), %composer, 0)
-                  sourceInformationMarkerEnd(%composer)
-                }, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun <T> Bug(items: List<T>, content: Function3<@[ParameterName(name = 'item')] T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "CC(Bug)P(1)*<conten...>:Test.kt")
-              val <iterator> = items.iterator()
-              while (<iterator>.hasNext()) {
-                val item = <iterator>.next()
-                content(item, %composer, 0b01110000 and %changed)
-              }
-              %composer.endReplaceableGroup()
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
@@ -3940,47 +1285,11 @@
             @ReadOnlyComposable
             @Composable
             fun getHashCode(): Int = currentComposer.hashCode()
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            open class Foo {
-              val current: Int
-                @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
-                get() {
-                  val tmp0 = %composer.hashCode()
-                  return tmp0
-                }
-              @ReadOnlyComposable
-              @Composable
-              fun getHashCode(%composer: Composer?, %changed: Int): Int {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val tmp0 = %composer.hashCode()
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                return tmp0
-              }
-              static val %stable: Int = 0
-            }
-            @ReadOnlyComposable
-            @Composable
-            fun getHashCode(%composer: Composer?, %changed: Int): Int {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0 = %composer.hashCode()
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              return tmp0
-            }
         """
     )
 
     @Test // regression test for 204897513
-    fun test_InlineForLoop_no_source_info() = verifyComposeIrTransform(
+    fun test_InlineForLoop_no_source_info() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -3996,39 +1305,6 @@
                 for (item in items) content(item)
             }
         """,
-        expectedTransformed = """
-            @Composable
-            private fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Bug(listOf(1, 2, 3), { it: ${if (useFir) "@[ParameterName(name = 'item')] " else ""}Int, %composer: Composer?, %changed: Int ->
-                  Text(it.toString(), %composer, 0)
-                }, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            private fun <T> Bug(items: List<T>, content: Function3<@[ParameterName(name = 'item')] T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              val <iterator> = items.iterator()
-              while (<iterator>.hasNext()) {
-                val item = <iterator>.next()
-                content(item, %composer, 0b01110000 and %changed)
-              }
-              %composer.endReplaceableGroup()
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
@@ -4038,7 +1314,7 @@
     )
 
     @Test
-    fun test_InlineSkipping() = verifyComposeIrTransform(
+    fun test_InlineSkipping() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -4059,34 +1335,11 @@
 
             @Composable
             fun Text(text: String) { }
-        """,
-        expectedTransformed = """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                InlineWrapperParam({ it: Int, %composer: Composer?, %changed: Int ->
-                  Text("Function %it", %composer, 0)
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun test_ComposableLambdaWithUnusedParameter() = verifyComposeIrTransform(
+    fun test_ComposableLambdaWithUnusedParameter() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -4098,31 +1351,12 @@
             import androidx.compose.runtime.*
 
             @Composable inline fun Layout() {}
-        """,
-        expectedTransformed = """
-            val layoutLambda: Function3<Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function3<Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { <unused var>: Int, %composer: Composer?, %changed: Int ->
-                if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Layout(%composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
     @Test
     fun testNonSkippableComposable() = comparisonPropagation(
-        """
-        """.trimIndent(),
+        "",
         """
             import androidx.compose.runtime.NonSkippableComposable
 
@@ -4131,24 +1365,6 @@
             fun Test(i: Int) {
                 used(i)
             }
-        """.trimIndent(),
-        """
-            @Composable
-            @NonSkippableComposable
-            fun Test(i: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              used(i)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(i, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """.trimIndent()
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionalInterfaceTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionalInterfaceTransformTests.kt
index 16f620b..f6f174c 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionalInterfaceTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/FunctionalInterfaceTransformTests.kt
@@ -23,7 +23,7 @@
 ) : AbstractControlFlowTransformTests(useFir) {
     @Test
     fun testFunctionalInterfaceWithExtensionReceiverTransformation() {
-        verifyComposeIrTransform(
+        verifyGoldenComposeIrTransform(
             source = """
                 import androidx.compose.runtime.*
                 fun interface TestContent {
@@ -41,91 +41,12 @@
                 fun CallTest() {
                     Test { this.length }
                 }
-            """.trimIndent(),
-            expectedTransformed = """
-            interface TestContent {
-              @Composable
-              abstract fun String.Content(%composer: Composer?, %changed: Int)
-            }
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun Test(content: TestContent, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)*<Conten...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                with(content) {
-                  %this%with.Content(%composer, 0b0110)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(content, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun CallTest(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(CallTest)<Test>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Test(<block>{
-                  class <no name provided> : TestContent {
-                    @Composable
-                    override fun Content(%this%Test: String, %composer: Composer?, %changed: Int) {
-                      %composer = %composer.startRestartGroup(<>)
-                      sourceInformation(%composer, "C(Content):Test.kt")
-                      val %dirty = %changed
-                      if (%changed and 0b1110 == 0) {
-                        %dirty = %dirty or if (%composer.changed(%this%Test)) 0b0100 else 0b0010
-                      }
-                      if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                        if (isTraceInProgress()) {
-                          traceEventStart(<>, %dirty, -1, <>)
-                        }
-                        %this%Test.length
-                        if (isTraceInProgress()) {
-                          traceEventEnd()
-                        }
-                      } else {
-                        %composer.skipToGroupEnd()
-                      }
-                      val tmp0_rcvr = <this>
-                      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                        tmp0_rcvr.Content(%this%Test, %composer, updateChangedFlags(%changed or 0b0001))
-                      }
-                    }
-                  }
-                  <no name provided>()
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                CallTest(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
             """.trimIndent()
         )
     }
 
     @Test
-    fun testFunInterfaces() = verifyComposeIrTransform(
+    fun testFunInterfaces() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -137,41 +58,11 @@
             fun Example(a: A) {
                 Example { it -> a.compute(it) }
             }
-        """,
-        """
-            interface A {
-              abstract fun compute(value: Int)
-            }
-            @Composable
-            fun Example(a: A, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<Exampl...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Example(A { it: Int ->
-                  a.compute(it)
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(a, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test
-    fun testComposableFunInterfaces() = verifyComposeIrTransform(
+    fun testComposableFunInterfaces() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -181,48 +72,11 @@
             fun Example(a: A) {
                 Example { it -> a.compute(it) }
             }
-        """,
-        """
-            interface A {
-              @Composable
-              abstract fun compute(value: Int, %composer: Composer?, %changed: Int)
-            }
-            fun Example(a: A) {
-              Example(<block>{
-                class <no name provided> : A {
-                  @Composable
-                  override fun compute(it: Int, %composer: Composer?, %changed: Int) {
-                    %composer = %composer.startRestartGroup(<>)
-                    sourceInformation(%composer, "C(compute)<comput...>:Test.kt")
-                    val %dirty = %changed
-                    if (%changed and 0b1110 == 0) {
-                      %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
-                    }
-                    if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %dirty, -1, <>)
-                      }
-                      a.compute(it, %composer, 0b1110 and %dirty)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                    val tmp0_rcvr = <this>
-                    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                      tmp0_rcvr.compute(it, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                  }
-                }
-                <no name provided>()
-              })
-            }
         """
     )
 
     @Test
-    fun testComposableFunInterfacesInVariance() = verifyComposeIrTransform(
+    fun testComposableFunInterfacesInVariance() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -239,53 +93,11 @@
                     println(string)
                 }
             }
-        """,
-        """
-            interface Consumer<T>  {
-              @Composable
-              abstract fun consume(t: T, %composer: Composer?, %changed: Int)
-            }
-            @StabilityInferred(parameters = 0)
-            class Repro<T: Any>  {
-              fun test(consumer: Consumer<in T>) { }
-              static val %stable: Int = 0
-            }
-            fun test() {
-              Repro().test(<block>{
-                class <no name provided> : Consumer<Any?> {
-                  @Composable
-                  override fun consume(string: String, %composer: Composer?, %changed: Int) {
-                    %composer = %composer.startRestartGroup(<>)
-                    sourceInformation(%composer, "C(consume):Test.kt")
-                    val %dirty = %changed
-                    if (%changed and 0b1110 == 0) {
-                      %dirty = %dirty or if (%composer.changed(string)) 0b0100 else 0b0010
-                    }
-                    if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %dirty, -1, <>)
-                      }
-                      println(string)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                    val tmp0_rcvr = <this>
-                    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                      tmp0_rcvr.consume(string, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                  }
-                }
-                <no name provided>()
-              })
-            }
         """
     )
 
     @Test
-    fun testCaptureStableFunInterface() = verifyComposeIrTransform(
+    fun testCaptureStableFunInterface() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -301,54 +113,11 @@
 
             @Composable inline fun Example(consumer: Consumer) {
             }
-        """,
-        """
-            interface Consumer {
-              abstract fun consume(t: Int)
-            }
-            @Composable
-            fun Test(int: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(int)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Example(<block>{
-                  %composer.startReplaceableGroup(<>)
-                  val tmpCache = %composer.cache(%composer.changed(int)) {
-                    Consumer { it: Int ->
-                      println(int)
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                  tmpCache
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(int, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "CC(Example):Test.kt")
-              %composer.endReplaceableGroup()
-            }
-        """
+            """
     )
 
     @Test
-    fun testNoCaptureFunInterface() = verifyComposeIrTransform(
+    fun testNoCaptureFunInterface() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -364,43 +133,11 @@
 
             @Composable inline fun Example(consumer: Consumer) {
             }
-        """,
-        """
-            interface Consumer {
-              abstract fun consume(t: Int)
-            }
-            @Composable
-            fun Test(int: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Example(Consumer { it: Int ->
-                  println(it)
-                }, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(int, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "CC(Example):Test.kt")
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
     @Test
-    fun testComposableFunInterfaceWAnonymousParam() = verifyComposeIrTransform(
+    fun testComposableFunInterfaceWAnonymousParam() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -415,73 +152,6 @@
 
             @Composable fun Example(consumer: Consumer) {
             }
-        """,
-        """
-            interface Consumer {
-              @Composable
-              abstract fun invoke(t: Int, %composer: Composer?, %changed: Int)
-            }
-            @Composable
-            fun Test(int: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Example(<block>{
-                  class <no name provided> : Consumer {
-                    @Composable
-                    override fun invoke(<unused var>: Int, %composer: Composer?, %changed: Int) {
-                      %composer = %composer.startRestartGroup(<>)
-                      sourceInformation(%composer, "C(invoke):Test.kt")
-                      if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                        if (isTraceInProgress()) {
-                          traceEventStart(<>, %changed, -1, <>)
-                        }
-                        Unit
-                        if (isTraceInProgress()) {
-                          traceEventEnd()
-                        }
-                      } else {
-                        %composer.skipToGroupEnd()
-                      }
-                      val tmp0_rcvr = <this>
-                      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                        tmp0_rcvr.invoke(<unused var>, %composer, updateChangedFlags(%changed or 0b0001))
-                      }
-                    }
-                  }
-                  <no name provided>()
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(int, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(consumer, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/GoldenTransformRule.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/GoldenTransformRule.kt
index 33316c1..8ef8565 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/GoldenTransformRule.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/GoldenTransformRule.kt
@@ -27,6 +27,7 @@
 
 private const val ENV_GENERATE_GOLDEN = "GENERATE_GOLDEN"
 private const val GOLDEN_FILE_TYPE = "txt"
+private fun env(name: String): Boolean = (System.getenv(name) ?: "false").toBoolean()
 
 /**
  * GoldenTransformRule
@@ -34,19 +35,23 @@
  * Compare transformed IR source to a golden test file. Golden files contain both the
  * pre-transformed and post-transformed source for easier review.
  * To regenerate the set of golden tests, pass GENERATE_GOLDEN=true as an environment variable.
+ *
+ * @param pathToGoldens: Path to golden files
+ * @param generateGoldens: When true, will generate the golden test file and replace any existing
+ * @param generateMissingGoldens: When true, will generate a golden file for any that are not found.
  **/
 class GoldenTransformRule(
     private val pathToGoldens: String,
-    private val generateGoldens: Boolean =
-        (System.getenv(ENV_GENERATE_GOLDEN) ?: "false").toBoolean()
+    private val generateGoldens: Boolean = env(ENV_GENERATE_GOLDEN),
+    private val generateMissingGoldens: Boolean = true
 ) : TestRule {
     private lateinit var goldenFile: File
     private lateinit var testIdentifier: String
 
     private val testWatcher = object : TestWatcher() {
         override fun starting(description: Description) {
-            goldenFile =
-                File(getGoldenFilePath(description.className, description.methodName))
+            val goldenFilePath = getGoldenFilePath(description.className, description.methodName)
+            goldenFile = File(goldenFilePath)
             testIdentifier = "${description.className}_${description.methodName}"
         }
     }
@@ -67,7 +72,7 @@
      * If generateGoldens is true, the golden file will first be generated.
      */
     fun verifyGolden(testInfo: GoldenTransformTestInfo) {
-        if (generateGoldens) {
+        if (generateGoldens || (!goldenFile.exists() && generateMissingGoldens)) {
             saveGolden(testInfo)
         }
 
@@ -81,8 +86,11 @@
             error("Golden ${goldenFile.absolutePath} file could not be parsed.\n${e.message}")
         }
 
+        // Use absolute path in the assert error so studio shows it as a link
         Assert.assertEquals(
-            "Transformed source does not match golden file ${goldenFile.name}",
+            "Transformed source does not match golden file:" +
+                "\n${goldenFile.absolutePath}\n" +
+                "To regenerate golden files, pass GENERATE_GOLDEN=true as an env variable.",
             loadedTestInfo.transformed,
             testInfo.transformed
         )
@@ -106,20 +114,40 @@
     val source: String,
     val transformed: String
 ) {
-    fun encodeToString(): String {
-        return "$source$DELIMITER$transformed"
-    }
+    fun encodeToString(): String =
+        buildString {
+            append(SOURCE_HEADER)
+            appendLine()
+            appendLine()
+            append(source)
+            appendLine()
+            appendLine()
+            append(TRANSFORM_HEADER)
+            appendLine()
+            appendLine()
+            append(transformed)
+            appendLine()
+        }
 
     companion object {
-        const val DELIMITER = "\n/********\n * TRANSFORMED\n ********/\n\n"
+        val SOURCE_HEADER = """
+            //
+            // Source
+            // ------------------------------------------
+        """.trimIndent()
+        val TRANSFORM_HEADER = """
+            //
+            // Transformed IR
+            // ------------------------------------------
+        """.trimIndent()
 
         fun fromEncodedString(encoded: String): GoldenTransformTestInfo {
-            val split = encoded.split(DELIMITER)
+            val split = encoded.removePrefix(SOURCE_HEADER).split(TRANSFORM_HEADER)
             if (split.size != 2) {
                 error("Could not parse encoded golden string. " +
                     "Expected 2 sections but was ${split.size}.")
             }
-            return GoldenTransformTestInfo(split[0], split[1])
+            return GoldenTransformTestInfo(split[0].trim(), split[1].trim())
         }
     }
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationRegressionTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationRegressionTests.kt
index 1aaa014..847e4c9 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationRegressionTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationRegressionTests.kt
@@ -28,41 +28,18 @@
  */
 class LambdaMemoizationRegressionTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     @Test
-    fun testNestedComposableSingletonsClass() = verifyComposeIrTransform(
+    fun testNestedComposableSingletonsClass() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
             class A {
                 val x = @Composable {}
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class A {
-              val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-              static val %stable: Int = 0
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
     @Test
-    fun testNestedComposableSingletonsClass2() = verifyComposeIrTransform(
+    fun testNestedComposableSingletonsClass2() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -71,62 +48,16 @@
                     val x = @Composable {}
                 }
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class A {
-              @StabilityInferred(parameters = 0)
-              class B {
-                val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-                static val %stable: Int = 0
-              }
-              static val %stable: Int = 0
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
     @Test
-    fun testJvmNameComposableSingletons() = verifyComposeIrTransform(
+    fun testJvmNameComposableSingletons() = verifyGoldenComposeIrTransform(
         """
             @file:JvmName("A")
             import androidx.compose.runtime.Composable
 
             val x = @Composable {}
-        """,
-        """
-            val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
index 4d695b3..c319b7e 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
@@ -20,7 +20,7 @@
 
 class LambdaMemoizationTransformTests(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     @Test
-    fun testCapturedThisFromFieldInitializer() = verifyComposeIrTransform(
+    fun testCapturedThisFromFieldInitializer() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -32,32 +32,11 @@
             }
         """,
         """
-            @StabilityInferred(parameters = 0)
-            class A {
-              val b: String = ""
-              val c: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  print(b)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-              static val %stable: Int = 0
-            }
-        """,
-        """
         """
     )
 
     @Test
-    fun testLocalInALocal() = verifyComposeIrTransform(
+    fun testLocalInALocal() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -70,84 +49,12 @@
             }
         """,
         """
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                @Composable
-                fun A(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(A):Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                }
-                @Composable
-                @ComposableInferredTarget(scheme = "[0[0]]")
-                fun B(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(B)<conten...>:Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  content(%composer, 0b1110 and %changed)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                }
-                @Composable
-                fun C(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(C)<B>:Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  B(composableLambda(%composer, <>, false) { %composer: Composer?, %changed: Int ->
-                    sourceInformation(%composer, "C<A()>:Test.kt")
-                    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, <>)
-                      }
-                      A(%composer, 0)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                  }, %composer, 0b0110)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
         """
     )
 
     // Fixes b/201252574
     @Test
-    fun testLocalFunCaptures() = verifyComposeIrTransform(
+    fun testLocalFunCaptures() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.NonRestartableComposable
             import androidx.compose.runtime.Composable
@@ -166,34 +73,11 @@
             }
         """,
         """
-            @NonRestartableComposable
-            @Composable
-            fun Err(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Err):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              fun handler() {
-                { x: Int ->
-                  x
-                }
-              }
-              {
-                handler()
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-        """,
-        """
         """
     )
 
     @Test
-    fun testLocalClassCaptures1() = verifyComposeIrTransform(
+    fun testLocalClassCaptures1() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.NonRestartableComposable
             import androidx.compose.runtime.Composable
@@ -209,42 +93,11 @@
                   Local().something(2)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Err(y: Int, z: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Err):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              class Local {
-                val w: Int = z
-                fun something(x: Int): Int {
-                  return x + y + w
-                }
-              }
-              %composer.startReplaceableGroup(<>)
-              val tmpCache = %composer.cache(%composer.changed(y) or %composer.changed(z)) {
-                {
-                  Local().something(2)
-                }
-              }
-              %composer.endReplaceableGroup()
-              tmpCache
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-        """,
-        """
         """
     )
 
     @Test
-    fun testLocalClassCaptures2() = verifyComposeIrTransform(
+    fun testLocalClassCaptures2() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.NonRestartableComposable
@@ -257,41 +110,11 @@
                     Foo(1)
                 }
             }
-        """,
-        """
-            @NonRestartableComposable
-            @Composable
-            fun Example(z: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              class Foo(val x: Int) {
-                val y: Int = z
-              }
-              val lambda = <block>{
-                %composer.startReplaceableGroup(<>)
-                val tmpCache = %composer.cache(%composer.changed(z)) {
-                  {
-                    Foo(1)
-                  }
-                }
-                %composer.endReplaceableGroup()
-                tmpCache
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-        """,
-        """
         """
     )
 
     @Test
-    fun testLocalFunCaptures3() = verifyComposeIrTransform(
+    fun testLocalFunCaptures3() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -305,48 +128,6 @@
             }
         """,
         """
-            @Composable
-            fun SimpleAnimatedContentSample(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(SimpleAnimatedContentSample)<Animat...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                @Composable
-                fun Foo(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Foo):Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endReplaceableGroup()
-                }
-                AnimatedContent(1.0f, composableLambda(%composer, <>, false) { it: ${if (useFir) "@[ParameterName(name = 'targetState')] " else ""}Float, %composer: Composer?, %changed: Int ->
-                  sourceInformation(%composer, "C<Foo()>:Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Foo(%composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                }, %composer, 0b00110110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                SimpleAnimatedContentSample(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
             import androidx.compose.animation.AnimatedVisibilityScope
 
@@ -359,7 +140,7 @@
     )
 
     @Test
-    fun testStateDelegateCapture() = verifyComposeIrTransform(
+    fun testStateDelegateCapture() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.mutableStateOf
@@ -373,48 +154,6 @@
             }
         """,
         """
-            @Composable
-            fun A(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<B>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val x by {
-                  val x%delegate = mutableStateOf(
-                    value = "abc"
-                  )
-                  get() {
-                    return x%delegate.getValue(null, ::x%delegate)
-                  }
-                }
-                B(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-                  sourceInformation(%composer, "C:Test.kt")
-                  if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    print(<get-x>())
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                }, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
 
             @Composable fun B(content: @Composable () -> Unit) {}
@@ -422,7 +161,7 @@
     )
 
     @Test
-    fun testTopLevelComposableLambdaProperties() = verifyComposeIrTransform(
+    fun testTopLevelComposableLambdaProperties() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -430,45 +169,11 @@
             val bar: @Composable () -> Unit = {}
         """,
         """
-            val foo: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            val bar: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-2
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-              val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
-        """,
-        """
         """
     )
 
     @Test
-    fun testLocalVariableComposableLambdas() = verifyComposeIrTransform(
+    fun testLocalVariableComposableLambdas() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -480,67 +185,13 @@
             }
         """,
         """
-            @Composable
-            fun A(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<B(foo)>,<B(bar)>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val foo = ComposableSingletons%TestKt.lambda-1
-                val bar = ComposableSingletons%TestKt.lambda-2
-                B(foo, %composer, 0b0110)
-                B(bar, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-              val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
             @Composable fun B(content: @Composable () -> Unit) {}
         """
     )
 
     @Test
-    fun testParameterComposableLambdas() = verifyComposeIrTransform(
+    fun testParameterComposableLambdas() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -549,50 +200,13 @@
             }
         """,
         """
-            @Composable
-            fun A(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(A)<B>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                B(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                A(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
             @Composable fun B(content: @Composable () -> Unit) {}
         """
     )
 
     @Test // Regression test for b/180168881
-    fun testFunctionReferenceWithinInferredComposableLambda() = verifyComposeIrTransform(
+    fun testFunctionReferenceWithinInferredComposableLambda() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -602,30 +216,11 @@
                     ::foo
                 }
             }
-        """,
-        """
-            fun Problem() {
-              fun foo() { }
-              val lambda = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  foo
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
         """
     )
 
     @Test
-    fun testFunctionReferenceNonComposableMemoization() = verifyComposeIrTransform(
+    fun testFunctionReferenceNonComposableMemoization() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             @Composable fun Example(x: Int) {
@@ -634,49 +229,12 @@
             }
         """,
         """
-            @Composable
-            fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                fun foo() {
-                  use(x)
-                }
-                val shouldMemoize = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  val tmpCache = %composer.cache(%composer.changed(x)) {
-                    {
-                      foo
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                  tmpCache
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             fun use(x: Any) = println(x)
-        """.trimIndent()
+        """
     )
 
     @Test // regression of b/162575428
-    fun testComposableInAFunctionParameter() = verifyComposeIrTransform(
+    fun testComposableInAFunctionParameter() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -689,54 +247,6 @@
             }
         """.replace('%', '$'),
         """
-            @Composable
-            fun Test(enabled: Boolean, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)P(1)<Wrap(c...>:Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
-                if (%default and 0b0010 != 0) {
-                  content = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-                    sourceInformation(%composer, "C<Displa...>:Test.kt")
-                    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, <>)
-                      }
-                      Display("%enabled", %composer, 0)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                  }
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                Wrap(content, %composer, 0b1110 and %dirty shr 0b0011)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(enabled, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
 
             @Composable fun Display(text: String) { }
@@ -745,7 +255,7 @@
     )
 
     @Test
-    fun testComposabableLambdaInLocalDeclaration() = verifyComposeIrTransform(
+    fun testComposabableLambdaInLocalDeclaration() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -758,45 +268,6 @@
             }
         """.replace('%', '$'),
         """
-            @Composable
-            fun Test(enabled: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<Wrap(c...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val content = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-                  sourceInformation(%composer, "C<Displa...>:Test.kt")
-                  if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    Display("%enabled", %composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                }
-                Wrap(content, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(enabled, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
 
             @Composable fun Display(text: String) { }
@@ -806,7 +277,7 @@
 
     // Ensure we don't remember lambdas that do not capture variables.
     @Test
-    fun testLambdaNoCapture() = verifyComposeIrTransform(
+    fun testLambdaNoCapture() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -821,58 +292,12 @@
                 println("Doesn't capture")
               }
             }
-        """,
         """
-            @Composable
-            fun TestLambda(content: Function0<Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(TestLambda):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                content()
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                TestLambda(content, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<TestLa...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                TestLambda({
-                  println("Doesn't capture")
-                }, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-    """
     )
 
     // Ensure the above test is valid as this should remember the lambda
     @Test
-    fun testLambdaDoesCapture() = verifyComposeIrTransform(
+    fun testLambdaDoesCapture() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -887,70 +312,13 @@
                 println("Captures a" + a)
               }
             }
-        """,
-        """
-            @Composable
-            fun TestLambda(content: Function0<Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(TestLambda):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                content()
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                TestLambda(content, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test(a: String, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<TestLa...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                TestLambda(<block>{
-                  %composer.startReplaceableGroup(<>)
-                  val tmpCache = %composer.cache(%composer.changed(a)) {
-                    {
-                      println("Captures a" + a)
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                  tmpCache
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     // We have to use composableLambdaInstance in crossinline lambdas, since they may be captured
     // in anonymous objects and called in a context with a different composer.
     @Test
-    fun testCrossinlineLambda() = verifyComposeIrTransform(
+    fun testCrossinlineLambda() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -962,55 +330,6 @@
             }
         """,
         """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)*<it()>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                var lambda = null
-                f { s: String ->
-                  lambda = composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                    sourceInformation(%composer, "C<Text(s...>:Test.kt")
-                    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, <>)
-                      }
-                      Text(s, %composer, 0)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                  }
-                }
-                val tmp0_safe_receiver = lambda
-                val tmp0_group = when {
-                  tmp0_safe_receiver == null -> {
-                    null
-                  }
-                  else -> {
-                    tmp0_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
-                      it(%composer, 0)
-                    }
-                  }
-                }
-                tmp0_group
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
             @Composable fun Text(s: String) {}
             inline fun f(crossinline block: (String) -> Unit) = block("")
@@ -1020,7 +339,7 @@
     // The lambda argument to remember and cache should not contain composable calls so
     // we have to use composableLambdaInstance.
     @Test
-    fun testRememberComposableLambda() = verifyComposeIrTransform(
+    fun testRememberComposableLambda() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -1031,70 +350,13 @@
             }
         """,
         """
-            @Composable
-            fun Test(s: String, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<rememb...>,<rememb...>,<curren...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(s)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                remember({
-                  composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                    sourceInformation(%composer, "C<Text(s...>:Test.kt")
-                    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, <>)
-                      }
-                      Text(s, %composer, 0b1110 and %dirty)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                  }
-                }, %composer, 0)(%composer, 6)
-                %composer.cache(false) {
-                  composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                    sourceInformation(%composer, "C<Text(s...>:Test.kt")
-                    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, <>)
-                      }
-                      Text(s, %composer, 0b1110 and %dirty)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                  }
-                }
-                (%composer, 6)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(s, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.Composable
             @Composable fun Text(s: String) {}
         """
     )
 
     @Test
-    fun memoizeLambdaInsideFunctionReturningValue() = verifyComposeIrTransform(
+    fun memoizeLambdaInsideFunctionReturningValue() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -1103,31 +365,6 @@
               Consume { foo.value }
         """,
         """
-        @Composable
-        fun Test(foo: Foo, %composer: Composer?, %changed: Int): Int {
-          %composer.startReplaceableGroup(<>)
-          sourceInformation(%composer, "C(Test)<Consum...>:Test.kt")
-          if (isTraceInProgress()) {
-            traceEventStart(<>, %changed, -1, <>)
-          }
-          val tmp0 = Consume(<block>{
-            %composer.startReplaceableGroup(<>)
-            val tmpCache = %composer.cache(%composer.changed(foo)) {
-              {
-                foo.value
-              }
-            }
-            %composer.endReplaceableGroup()
-            tmpCache
-          }, %composer, 0)
-          if (isTraceInProgress()) {
-            traceEventEnd()
-          }
-          %composer.endReplaceableGroup()
-          return tmp0
-        }
-        """.trimIndent(),
-        """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.Stable
 
@@ -1138,17 +375,12 @@
             class Foo {
                 val value: Int = 0
             }
-        """.trimIndent()
+        """
     )
 
     @Test
     fun testComposableCaptureInDelegates() {
-        val delegateImplementation = """
-                  val content: Function2<Composer, Int, Unit>
-                    get() {
-                      return <this>.%%delegate_0.content
-                    }"""
-        verifyComposeIrTransform(
+        verifyGoldenComposeIrTransform(
             """
                 import androidx.compose.runtime.*
 
@@ -1157,27 +389,6 @@
                 })
             """,
             """
-                @StabilityInferred(parameters = 0)
-                class Test(val value: Int) : Delegate {${if (useFir) delegateImplementation else ""}
-                  private val %%delegate_0: Impl = Impl(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                    sourceInformation(%composer, "C:Test.kt")
-                    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, <>)
-                      }
-                      value
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
-                    } else {
-                      %composer.skipToGroupEnd()
-                    }
-                  }
-                  )${if (!useFir) delegateImplementation else ""}
-                  static val %stable: Int = 0
-                }
-            """,
-            """
                 import androidx.compose.runtime.Composable
 
                 interface Delegate {
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralTransformTests.kt
index b2cb4ad..3d79ea5 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralTransformTests.kt
@@ -379,46 +379,11 @@
                     override fun bar(): Int { return 1 }
                 }
             }
-        """,
-        """
-            interface Foo {
-              abstract fun bar(): Int
-            }
-            fun a(): Foo {
-              return object : Foo {
-                override fun bar(): Int {
-                  return LiveLiterals%TestKt.Int%fun-bar%class-%no-name-provided%%fun-a()
-                }
-              }
-            }
-            @LiveLiteralFileInfo(file = "/Test.kt")
-            internal object LiveLiterals%TestKt {
-              val Int%fun-bar%class-%no-name-provided%%fun-a: Int = 1
-              var State%Int%fun-bar%class-%no-name-provided%%fun-a: State<Int>?
-              @LiveLiteralInfo(key = "Int%fun-bar%class-%no-name-provided%%fun-a", offset = 159)
-              fun Int%fun-bar%class-%no-name-provided%%fun-a(): Int {
-                if (!isLiveLiteralsEnabled) {
-                  return Int%fun-bar%class-%no-name-provided%%fun-a
-                }
-                val tmp0 = State%Int%fun-bar%class-%no-name-provided%%fun-a
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("Int%fun-bar%class-%no-name-provided%%fun-a", Int%fun-bar%class-%no-name-provided%%fun-a)
-                  State%Int%fun-bar%class-%no-name-provided%%fun-a = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-            }
         """
     )
 
     @Test
     fun testBasicTransform() {
-        // String constant start offsets are off by one in K2.
-        // TODO: Inline the non-K2 offset once fixed.
-        val stringConstantOffset = if (useFir) 85 else 86
         assertTransform(
             """
             """,
@@ -434,141 +399,6 @@
                   }
                   print(3)
                 }
-            """,
-            """
-                fun A() {
-                  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
-                  print(LiveLiterals%TestKt.String%arg-0%call-print-1%fun-A())
-                  if (LiveLiterals%TestKt.Boolean%cond%if%fun-A()) {
-                    print(LiveLiterals%TestKt.Int%arg-0%call-print%branch%if%fun-A())
-                  }
-                  if (LiveLiterals%TestKt.Boolean%cond%if-1%fun-A()) {
-                    print(LiveLiterals%TestKt.Float%arg-0%call-print%branch%if-1%fun-A())
-                  }
-                  print(LiveLiterals%TestKt.Int%arg-0%call-print-2%fun-A())
-                }
-                @LiveLiteralFileInfo(file = "/Test.kt")
-                internal object LiveLiterals%TestKt {
-                  val Int%arg-0%call-print%fun-A: Int = 1
-                  var State%Int%arg-0%call-print%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 70)
-                  fun Int%arg-0%call-print%fun-A(): Int {
-                    if (!isLiveLiteralsEnabled) {
-                      return Int%arg-0%call-print%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-print%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
-                      State%Int%arg-0%call-print%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val String%arg-0%call-print-1%fun-A: String = "Hello World"
-                  var State%String%arg-0%call-print-1%fun-A: State<String>?
-                  @LiveLiteralInfo(key = "String%arg-0%call-print-1%fun-A", offset = $stringConstantOffset)
-                  fun String%arg-0%call-print-1%fun-A(): String {
-                    if (!isLiveLiteralsEnabled) {
-                      return String%arg-0%call-print-1%fun-A
-                    }
-                    val tmp0 = State%String%arg-0%call-print-1%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("String%arg-0%call-print-1%fun-A", String%arg-0%call-print-1%fun-A)
-                      State%String%arg-0%call-print-1%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Boolean%cond%if%fun-A: Boolean = true
-                  var State%Boolean%cond%if%fun-A: State<Boolean>?
-                  @LiveLiteralInfo(key = "Boolean%cond%if%fun-A", offset = 110)
-                  fun Boolean%cond%if%fun-A(): Boolean {
-                    if (!isLiveLiteralsEnabled) {
-                      return Boolean%cond%if%fun-A
-                    }
-                    val tmp0 = State%Boolean%cond%if%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Boolean%cond%if%fun-A", Boolean%cond%if%fun-A)
-                      State%Boolean%cond%if%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Int%arg-0%call-print%branch%if%fun-A: Int = 4
-                  var State%Int%arg-0%call-print%branch%if%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-print%branch%if%fun-A", offset = 132)
-                  fun Int%arg-0%call-print%branch%if%fun-A(): Int {
-                    if (!isLiveLiteralsEnabled) {
-                      return Int%arg-0%call-print%branch%if%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-print%branch%if%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-print%branch%if%fun-A", Int%arg-0%call-print%branch%if%fun-A)
-                      State%Int%arg-0%call-print%branch%if%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Boolean%cond%if-1%fun-A: Boolean = true
-                  var State%Boolean%cond%if-1%fun-A: State<Boolean>?
-                  @LiveLiteralInfo(key = "Boolean%cond%if-1%fun-A", offset = 153)
-                  fun Boolean%cond%if-1%fun-A(): Boolean {
-                    if (!isLiveLiteralsEnabled) {
-                      return Boolean%cond%if-1%fun-A
-                    }
-                    val tmp0 = State%Boolean%cond%if-1%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Boolean%cond%if-1%fun-A", Boolean%cond%if-1%fun-A)
-                      State%Boolean%cond%if-1%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Float%arg-0%call-print%branch%if-1%fun-A: Float = 1.0f
-                  var State%Float%arg-0%call-print%branch%if-1%fun-A: State<Float>?
-                  @LiveLiteralInfo(key = "Float%arg-0%call-print%branch%if-1%fun-A", offset = 175)
-                  fun Float%arg-0%call-print%branch%if-1%fun-A(): Float {
-                    if (!isLiveLiteralsEnabled) {
-                      return Float%arg-0%call-print%branch%if-1%fun-A
-                    }
-                    val tmp0 = State%Float%arg-0%call-print%branch%if-1%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Float%arg-0%call-print%branch%if-1%fun-A", Float%arg-0%call-print%branch%if-1%fun-A)
-                      State%Float%arg-0%call-print%branch%if-1%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Int%arg-0%call-print-2%fun-A: Int = 3
-                  var State%Int%arg-0%call-print-2%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-print-2%fun-A", offset = 201)
-                  fun Int%arg-0%call-print-2%fun-A(): Int {
-                    if (!isLiveLiteralsEnabled) {
-                      return Int%arg-0%call-print-2%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-print-2%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-print-2%fun-A", Int%arg-0%call-print-2%fun-A)
-                      State%Int%arg-0%call-print-2%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                }
             """
         )
     }
@@ -584,48 +414,6 @@
                 fun A() {
                     print(3 + 4)
                 }
-            """,
-            """
-                fun A() {
-                  print(LiveLiterals%TestKt.Int%%this%call-plus%arg-0%call-print%fun-A() + LiveLiterals%TestKt.Int%arg-0%call-plus%arg-0%call-print%fun-A())
-                }
-                @LiveLiteralFileInfo(file = "/Test.kt")
-                internal object LiveLiterals%TestKt {
-                  val Int%%this%call-plus%arg-0%call-print%fun-A: Int = 3
-                  var State%Int%%this%call-plus%arg-0%call-print%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%%this%call-plus%arg-0%call-print%fun-A", offset = 72)
-                  fun Int%%this%call-plus%arg-0%call-print%fun-A(): Int {
-                    if (!isLiveLiteralsEnabled) {
-                      return Int%%this%call-plus%arg-0%call-print%fun-A
-                    }
-                    val tmp0 = State%Int%%this%call-plus%arg-0%call-print%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%%this%call-plus%arg-0%call-print%fun-A", Int%%this%call-plus%arg-0%call-print%fun-A)
-                      State%Int%%this%call-plus%arg-0%call-print%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Int%arg-0%call-plus%arg-0%call-print%fun-A: Int = 4
-                  var State%Int%arg-0%call-plus%arg-0%call-print%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-plus%arg-0%call-print%fun-A", offset = 76)
-                  fun Int%arg-0%call-plus%arg-0%call-print%fun-A(): Int {
-                    if (!isLiveLiteralsEnabled) {
-                      return Int%arg-0%call-plus%arg-0%call-print%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-plus%arg-0%call-print%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-plus%arg-0%call-print%fun-A", Int%arg-0%call-plus%arg-0%call-print%fun-A)
-                      State%Int%arg-0%call-plus%arg-0%call-print%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                }
             """
         )
     }
@@ -641,37 +429,12 @@
                 fun A() {
                     print(3 + 4)
                 }
-            """,
-            """
-                fun A() {
-                  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
-                }
-                @LiveLiteralFileInfo(file = "/Test.kt")
-                internal object LiveLiterals%TestKt {
-                  val Int%arg-0%call-print%fun-A: Int = 7
-                  var State%Int%arg-0%call-print%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 74)
-                  fun Int%arg-0%call-print%fun-A(): Int {
-                    if (!isLiveLiteralsEnabled) {
-                      return Int%arg-0%call-print%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-print%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
-                      State%Int%arg-0%call-print%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                }
             """
         )
     }
 
     @Test
-    fun testComposeIrSkippingWithDefaultsRelease() = verifyComposeIrTransform(
+    fun testComposeIrSkippingWithDefaultsRelease() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.ui.text.input.TextFieldValue
             import androidx.compose.runtime.*
@@ -693,152 +456,6 @@
                     Text("${'$'}keyboardActions2")
                 }
             }
-        """.trimIndent(),
-        """
-            @StabilityInferred(parameters = 0)
-            object Ui {
-              static val %stable: Int = LiveLiterals%TestKt.Int%class-Ui()
-            }
-            @Composable
-            @ComposableTarget(applier = "androidx.compose.ui.UiComposable")
-            fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(UiTextField)")
-              val %dirty = %changed
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(isError)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    isError = LiveLiterals%TestKt.Boolean%param-isError%fun-UiTextField()
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                  if (%default and 0b0010 != 0) {
-                    keyboardActions2 = LiveLiterals%TestKt.Boolean%param-keyboardActions2%fun-UiTextField()
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println%fun-UiTextField()}%isError")
-                println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println-1%fun-UiTextField()}%keyboardActions2")
-                Column(null, null, null, { %composer: Composer?, %changed: Int ->
-                  Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
-                  Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
-                }, %composer, 0, 0b0111)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            @LiveLiteralFileInfo(file = "/Test.kt")
-            internal object LiveLiterals%TestKt {
-              val Int%class-Ui: Int = 0
-              var State%Int%class-Ui: State<Int>?
-              @LiveLiteralInfo(key = "Int%class-Ui", offset = -1)
-              fun Int%class-Ui(): Int {
-                if (!isLiveLiteralsEnabled) {
-                  return Int%class-Ui
-                }
-                val tmp0 = State%Int%class-Ui
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("Int%class-Ui", Int%class-Ui)
-                  State%Int%class-Ui = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-              val Boolean%param-isError%fun-UiTextField: Boolean = false
-              var State%Boolean%param-isError%fun-UiTextField: State<Boolean>?
-              @LiveLiteralInfo(key = "Boolean%param-isError%fun-UiTextField", offset = 292)
-              fun Boolean%param-isError%fun-UiTextField(): Boolean {
-                if (!isLiveLiteralsEnabled) {
-                  return Boolean%param-isError%fun-UiTextField
-                }
-                val tmp0 = State%Boolean%param-isError%fun-UiTextField
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("Boolean%param-isError%fun-UiTextField", Boolean%param-isError%fun-UiTextField)
-                  State%Boolean%param-isError%fun-UiTextField = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-              val Boolean%param-keyboardActions2%fun-UiTextField: Boolean = false
-              var State%Boolean%param-keyboardActions2%fun-UiTextField: State<Boolean>?
-              @LiveLiteralInfo(key = "Boolean%param-keyboardActions2%fun-UiTextField", offset = 331)
-              fun Boolean%param-keyboardActions2%fun-UiTextField(): Boolean {
-                if (!isLiveLiteralsEnabled) {
-                  return Boolean%param-keyboardActions2%fun-UiTextField
-                }
-                val tmp0 = State%Boolean%param-keyboardActions2%fun-UiTextField
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("Boolean%param-keyboardActions2%fun-UiTextField", Boolean%param-keyboardActions2%fun-UiTextField)
-                  State%Boolean%param-keyboardActions2%fun-UiTextField = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-              val String%0%str%arg-0%call-println%fun-UiTextField: String = "t41 insideFunction "
-              var State%String%0%str%arg-0%call-println%fun-UiTextField: State<String>?
-              @LiveLiteralInfo(key = "String%0%str%arg-0%call-println%fun-UiTextField", offset = 355)
-              fun String%0%str%arg-0%call-println%fun-UiTextField(): String {
-                if (!isLiveLiteralsEnabled) {
-                  return String%0%str%arg-0%call-println%fun-UiTextField
-                }
-                val tmp0 = State%String%0%str%arg-0%call-println%fun-UiTextField
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("String%0%str%arg-0%call-println%fun-UiTextField", String%0%str%arg-0%call-println%fun-UiTextField)
-                  State%String%0%str%arg-0%call-println%fun-UiTextField = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-              val String%0%str%arg-0%call-println-1%fun-UiTextField: String = "t41 insideFunction "
-              var State%String%0%str%arg-0%call-println-1%fun-UiTextField: State<String>?
-              @LiveLiteralInfo(key = "String%0%str%arg-0%call-println-1%fun-UiTextField", offset = 398)
-              fun String%0%str%arg-0%call-println-1%fun-UiTextField(): String {
-                if (!isLiveLiteralsEnabled) {
-                  return String%0%str%arg-0%call-println-1%fun-UiTextField
-                }
-                val tmp0 = State%String%0%str%arg-0%call-println-1%fun-UiTextField
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("String%0%str%arg-0%call-println-1%fun-UiTextField", String%0%str%arg-0%call-println-1%fun-UiTextField)
-                  State%String%0%str%arg-0%call-println-1%fun-UiTextField = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-            }
-        """
+        """.trimIndent()
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralV2TransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralV2TransformTests.kt
index 9c071e3..20ee0b1 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralV2TransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/LiveLiteralV2TransformTests.kt
@@ -379,47 +379,11 @@
                     override fun bar(): Int { return 1 }
                 }
             }
-        """,
-        """
-            interface Foo {
-              abstract fun bar(): Int
-            }
-            fun a(): Foo {
-              return object : Foo {
-                override fun bar(): Int {
-                  return LiveLiterals%TestKt.Int%fun-bar%class-%no-name-provided%%fun-a()
-                }
-              }
-            }
-            @LiveLiteralFileInfo(file = "/Test.kt")
-            internal object LiveLiterals%TestKt {
-              val enabled: Boolean = false
-              val Int%fun-bar%class-%no-name-provided%%fun-a: Int = 1
-              var State%Int%fun-bar%class-%no-name-provided%%fun-a: State<Int>?
-              @LiveLiteralInfo(key = "Int%fun-bar%class-%no-name-provided%%fun-a", offset = 159)
-              fun Int%fun-bar%class-%no-name-provided%%fun-a(): Int {
-                if (!enabled) {
-                  return Int%fun-bar%class-%no-name-provided%%fun-a
-                }
-                val tmp0 = State%Int%fun-bar%class-%no-name-provided%%fun-a
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("Int%fun-bar%class-%no-name-provided%%fun-a", Int%fun-bar%class-%no-name-provided%%fun-a)
-                  State%Int%fun-bar%class-%no-name-provided%%fun-a = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-            }
         """
     )
 
     @Test
     fun testBasicTransform() {
-        // String constant start offsets are off by one in K2.
-        // TODO: Inline the non-K2 offset once fixed.
-        val stringConstantOffset = if (useFir) 85 else 86
         assertTransform(
             """
             """,
@@ -435,142 +399,6 @@
                   }
                   print(3)
                 }
-            """,
-            """
-                fun A() {
-                  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
-                  print(LiveLiterals%TestKt.String%arg-0%call-print-1%fun-A())
-                  if (LiveLiterals%TestKt.Boolean%cond%if%fun-A()) {
-                    print(LiveLiterals%TestKt.Int%arg-0%call-print%branch%if%fun-A())
-                  }
-                  if (LiveLiterals%TestKt.Boolean%cond%if-1%fun-A()) {
-                    print(LiveLiterals%TestKt.Float%arg-0%call-print%branch%if-1%fun-A())
-                  }
-                  print(LiveLiterals%TestKt.Int%arg-0%call-print-2%fun-A())
-                }
-                @LiveLiteralFileInfo(file = "/Test.kt")
-                internal object LiveLiterals%TestKt {
-                  val enabled: Boolean = false
-                  val Int%arg-0%call-print%fun-A: Int = 1
-                  var State%Int%arg-0%call-print%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 70)
-                  fun Int%arg-0%call-print%fun-A(): Int {
-                    if (!enabled) {
-                      return Int%arg-0%call-print%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-print%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
-                      State%Int%arg-0%call-print%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val String%arg-0%call-print-1%fun-A: String = "Hello World"
-                  var State%String%arg-0%call-print-1%fun-A: State<String>?
-                  @LiveLiteralInfo(key = "String%arg-0%call-print-1%fun-A", offset = $stringConstantOffset)
-                  fun String%arg-0%call-print-1%fun-A(): String {
-                    if (!enabled) {
-                      return String%arg-0%call-print-1%fun-A
-                    }
-                    val tmp0 = State%String%arg-0%call-print-1%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("String%arg-0%call-print-1%fun-A", String%arg-0%call-print-1%fun-A)
-                      State%String%arg-0%call-print-1%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Boolean%cond%if%fun-A: Boolean = true
-                  var State%Boolean%cond%if%fun-A: State<Boolean>?
-                  @LiveLiteralInfo(key = "Boolean%cond%if%fun-A", offset = 110)
-                  fun Boolean%cond%if%fun-A(): Boolean {
-                    if (!enabled) {
-                      return Boolean%cond%if%fun-A
-                    }
-                    val tmp0 = State%Boolean%cond%if%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Boolean%cond%if%fun-A", Boolean%cond%if%fun-A)
-                      State%Boolean%cond%if%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Int%arg-0%call-print%branch%if%fun-A: Int = 7
-                  var State%Int%arg-0%call-print%branch%if%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-print%branch%if%fun-A", offset = 132)
-                  fun Int%arg-0%call-print%branch%if%fun-A(): Int {
-                    if (!enabled) {
-                      return Int%arg-0%call-print%branch%if%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-print%branch%if%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-print%branch%if%fun-A", Int%arg-0%call-print%branch%if%fun-A)
-                      State%Int%arg-0%call-print%branch%if%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Boolean%cond%if-1%fun-A: Boolean = true
-                  var State%Boolean%cond%if-1%fun-A: State<Boolean>?
-                  @LiveLiteralInfo(key = "Boolean%cond%if-1%fun-A", offset = 153)
-                  fun Boolean%cond%if-1%fun-A(): Boolean {
-                    if (!enabled) {
-                      return Boolean%cond%if-1%fun-A
-                    }
-                    val tmp0 = State%Boolean%cond%if-1%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Boolean%cond%if-1%fun-A", Boolean%cond%if-1%fun-A)
-                      State%Boolean%cond%if-1%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Float%arg-0%call-print%branch%if-1%fun-A: Float = 1.0f
-                  var State%Float%arg-0%call-print%branch%if-1%fun-A: State<Float>?
-                  @LiveLiteralInfo(key = "Float%arg-0%call-print%branch%if-1%fun-A", offset = 175)
-                  fun Float%arg-0%call-print%branch%if-1%fun-A(): Float {
-                    if (!enabled) {
-                      return Float%arg-0%call-print%branch%if-1%fun-A
-                    }
-                    val tmp0 = State%Float%arg-0%call-print%branch%if-1%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Float%arg-0%call-print%branch%if-1%fun-A", Float%arg-0%call-print%branch%if-1%fun-A)
-                      State%Float%arg-0%call-print%branch%if-1%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Int%arg-0%call-print-2%fun-A: Int = 3
-                  var State%Int%arg-0%call-print-2%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-print-2%fun-A", offset = 201)
-                  fun Int%arg-0%call-print-2%fun-A(): Int {
-                    if (!enabled) {
-                      return Int%arg-0%call-print-2%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-print-2%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-print-2%fun-A", Int%arg-0%call-print-2%fun-A)
-                      State%Int%arg-0%call-print-2%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                }
             """
         )
     }
@@ -586,49 +414,6 @@
                 fun A() {
                     print(3 + 4)
                 }
-            """,
-            """
-                fun A() {
-                  print(LiveLiterals%TestKt.Int%%this%call-plus%arg-0%call-print%fun-A() + LiveLiterals%TestKt.Int%arg-0%call-plus%arg-0%call-print%fun-A())
-                }
-                @LiveLiteralFileInfo(file = "/Test.kt")
-                internal object LiveLiterals%TestKt {
-                  val enabled: Boolean = false
-                  val Int%%this%call-plus%arg-0%call-print%fun-A: Int = 3
-                  var State%Int%%this%call-plus%arg-0%call-print%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%%this%call-plus%arg-0%call-print%fun-A", offset = 72)
-                  fun Int%%this%call-plus%arg-0%call-print%fun-A(): Int {
-                    if (!enabled) {
-                      return Int%%this%call-plus%arg-0%call-print%fun-A
-                    }
-                    val tmp0 = State%Int%%this%call-plus%arg-0%call-print%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%%this%call-plus%arg-0%call-print%fun-A", Int%%this%call-plus%arg-0%call-print%fun-A)
-                      State%Int%%this%call-plus%arg-0%call-print%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                  val Int%arg-0%call-plus%arg-0%call-print%fun-A: Int = 4
-                  var State%Int%arg-0%call-plus%arg-0%call-print%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-plus%arg-0%call-print%fun-A", offset = 76)
-                  fun Int%arg-0%call-plus%arg-0%call-print%fun-A(): Int {
-                    if (!enabled) {
-                      return Int%arg-0%call-plus%arg-0%call-print%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-plus%arg-0%call-print%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-plus%arg-0%call-print%fun-A", Int%arg-0%call-plus%arg-0%call-print%fun-A)
-                      State%Int%arg-0%call-plus%arg-0%call-print%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                }
             """
         )
     }
@@ -644,38 +429,12 @@
                 fun A() {
                     print(3 + 4)
                 }
-            """,
-            """
-                fun A() {
-                  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
-                }
-                @LiveLiteralFileInfo(file = "/Test.kt")
-                internal object LiveLiterals%TestKt {
-                  val enabled: Boolean = false
-                  val Int%arg-0%call-print%fun-A: Int = 7
-                  var State%Int%arg-0%call-print%fun-A: State<Int>?
-                  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 74)
-                  fun Int%arg-0%call-print%fun-A(): Int {
-                    if (!enabled) {
-                      return Int%arg-0%call-print%fun-A
-                    }
-                    val tmp0 = State%Int%arg-0%call-print%fun-A
-                    return if (tmp0 == null) {
-                      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
-                      State%Int%arg-0%call-print%fun-A = tmp1
-                      tmp1
-                    } else {
-                      tmp0
-                    }
-                    .value
-                  }
-                }
             """
         )
     }
 
     @Test
-    fun testComposeIrSkippingWithDefaultsRelease() = verifyComposeIrTransform(
+    fun testComposeIrSkippingWithDefaultsRelease() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.ui.text.input.TextFieldValue
             import androidx.compose.runtime.*
@@ -697,153 +456,6 @@
                     Text("${'$'}keyboardActions2")
                 }
             }
-        """.trimIndent(),
-        """
-            @StabilityInferred(parameters = 0)
-            object Ui {
-              static val %stable: Int = LiveLiterals%TestKt.Int%class-Ui()
-            }
-            @Composable
-            @ComposableTarget(applier = "androidx.compose.ui.UiComposable")
-            fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(UiTextField)")
-              val %dirty = %changed
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(isError)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    isError = LiveLiterals%TestKt.Boolean%param-isError%fun-UiTextField()
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                  if (%default and 0b0010 != 0) {
-                    keyboardActions2 = LiveLiterals%TestKt.Boolean%param-keyboardActions2%fun-UiTextField()
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println%fun-UiTextField()}%isError")
-                println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println-1%fun-UiTextField()}%keyboardActions2")
-                Column(null, null, null, { %composer: Composer?, %changed: Int ->
-                  Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
-                  Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
-                }, %composer, 0, 0b0111)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            @LiveLiteralFileInfo(file = "/Test.kt")
-            internal object LiveLiterals%TestKt {
-              val enabled: Boolean = false
-              val Int%class-Ui: Int = 0
-              var State%Int%class-Ui: State<Int>?
-              @LiveLiteralInfo(key = "Int%class-Ui", offset = -1)
-              fun Int%class-Ui(): Int {
-                if (!enabled) {
-                  return Int%class-Ui
-                }
-                val tmp0 = State%Int%class-Ui
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("Int%class-Ui", Int%class-Ui)
-                  State%Int%class-Ui = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-              val Boolean%param-isError%fun-UiTextField: Boolean = false
-              var State%Boolean%param-isError%fun-UiTextField: State<Boolean>?
-              @LiveLiteralInfo(key = "Boolean%param-isError%fun-UiTextField", offset = 292)
-              fun Boolean%param-isError%fun-UiTextField(): Boolean {
-                if (!enabled) {
-                  return Boolean%param-isError%fun-UiTextField
-                }
-                val tmp0 = State%Boolean%param-isError%fun-UiTextField
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("Boolean%param-isError%fun-UiTextField", Boolean%param-isError%fun-UiTextField)
-                  State%Boolean%param-isError%fun-UiTextField = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-              val Boolean%param-keyboardActions2%fun-UiTextField: Boolean = false
-              var State%Boolean%param-keyboardActions2%fun-UiTextField: State<Boolean>?
-              @LiveLiteralInfo(key = "Boolean%param-keyboardActions2%fun-UiTextField", offset = 331)
-              fun Boolean%param-keyboardActions2%fun-UiTextField(): Boolean {
-                if (!enabled) {
-                  return Boolean%param-keyboardActions2%fun-UiTextField
-                }
-                val tmp0 = State%Boolean%param-keyboardActions2%fun-UiTextField
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("Boolean%param-keyboardActions2%fun-UiTextField", Boolean%param-keyboardActions2%fun-UiTextField)
-                  State%Boolean%param-keyboardActions2%fun-UiTextField = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-              val String%0%str%arg-0%call-println%fun-UiTextField: String = "t41 insideFunction "
-              var State%String%0%str%arg-0%call-println%fun-UiTextField: State<String>?
-              @LiveLiteralInfo(key = "String%0%str%arg-0%call-println%fun-UiTextField", offset = 355)
-              fun String%0%str%arg-0%call-println%fun-UiTextField(): String {
-                if (!enabled) {
-                  return String%0%str%arg-0%call-println%fun-UiTextField
-                }
-                val tmp0 = State%String%0%str%arg-0%call-println%fun-UiTextField
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("String%0%str%arg-0%call-println%fun-UiTextField", String%0%str%arg-0%call-println%fun-UiTextField)
-                  State%String%0%str%arg-0%call-println%fun-UiTextField = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-              val String%0%str%arg-0%call-println-1%fun-UiTextField: String = "t41 insideFunction "
-              var State%String%0%str%arg-0%call-println-1%fun-UiTextField: State<String>?
-              @LiveLiteralInfo(key = "String%0%str%arg-0%call-println-1%fun-UiTextField", offset = 398)
-              fun String%0%str%arg-0%call-println-1%fun-UiTextField(): String {
-                if (!enabled) {
-                  return String%0%str%arg-0%call-println-1%fun-UiTextField
-                }
-                val tmp0 = State%String%0%str%arg-0%call-println-1%fun-UiTextField
-                return if (tmp0 == null) {
-                  val tmp1 = liveLiteral("String%0%str%arg-0%call-println-1%fun-UiTextField", String%0%str%arg-0%call-println-1%fun-UiTextField)
-                  State%String%0%str%arg-0%call-println-1%fun-UiTextField = tmp1
-                  tmp1
-                } else {
-                  tmp0
-                }
-                .value
-              }
-            }
-        """
+        """.trimIndent()
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
index c44d2d2..a8ec9e8 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
@@ -31,16 +31,14 @@
         unchecked: String,
         @Language("kotlin")
         checked: String,
-        expectedTransformed: String,
         dumpTree: Boolean = false
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.remember
 
             $checked
         """.trimIndent(),
-        expectedTransformed,
         """
             import androidx.compose.runtime.Composable
 
@@ -76,46 +74,6 @@
                 val a = if (x) { remember { 1 } } else { 2 }
                 val b = remember { 2 }
             }
-        """,
-        """
-            @Composable
-            @NonRestartableComposable
-            fun app(x: Boolean, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(app):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val a = <block>{
-                %composer.startReplaceableGroup(<>)
-                val tmp1_group = if (x) {
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(app):Test.kt")
-                  val tmp0_group = %composer.cache(false) {
-                    1
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                } else {
-                  2
-                }
-                %composer.endReplaceableGroup()
-                tmp1_group
-              }
-              val b = <block>{
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(app):Test.kt")
-                val tmp2_group = %composer.cache(false) {
-                  2
-                }
-                %composer.endReplaceableGroup()
-                tmp2_group
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -135,37 +93,6 @@
                 }
                 return deferred > 10
             }
-        """,
-        """
-            @Composable
-            fun <T> loadResourceInternal(key: String, pendingResource: T?, failedResource: T?, %composer: Composer?, %changed: Int, %default: Int): Boolean {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(loadResourceInternal)P(1,2):Test.kt")
-              if (%default and 0b0010 != 0) {
-                pendingResource = null
-              }
-              if (%default and 0b0100 != 0) {
-                failedResource = null
-              }
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val deferred = <block>{
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(loadResourceInternal)P(1,2):Test.kt")
-                val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(key) || %changed and 0b0110 == 0b0100 or %changed and 0b01110000 xor 0b00110000 > 32 && %composer.changed(pendingResource) || %changed and 0b00110000 == 0b00100000 or %changed and 0b001110000000 xor 0b000110000000 > 256 && %composer.changed(failedResource) || %changed and 0b000110000000 == 0b000100000000) {
-                  123
-                }
-                %composer.endReplaceableGroup()
-                tmp1_group
-              }
-              val tmp0 = deferred > 10
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -189,87 +116,6 @@
             fun test3(x: Uncertain) {
                 remember(x) { 1 }
             }
-        """,
-        """
-            @Composable
-            fun test1(x: KnownStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(test1):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(test1):Test.kt")
-                val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
-                  1
-                }
-                %composer.endReplaceableGroup()
-                tmp0_group
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                test1(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun test2(x: KnownUnstable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(test2):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(test2):Test.kt")
-              val tmp0_group = %composer.cache(%composer.changed(x)) {
-                1
-              }
-              %composer.endReplaceableGroup()
-              tmp0_group
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                test2(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun test3(x: Uncertain, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(test3):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(test3):Test.kt")
-                val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 || %dirty and 0b1000 != 0 && %composer.changed(x)) {
-                  1
-                }
-                %composer.endReplaceableGroup()
-                tmp0_group
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                test3(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -298,68 +144,6 @@
             fun test3(x: Uncertain) {
                 remember(x) { 1 }
             }
-        """,
-        """
-            @Composable
-            @NonRestartableComposable
-            fun test1(x: KnownStable, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(test1):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(test1):Test.kt")
-              val tmp0_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(x) || %changed and 0b0110 == 0b0100) {
-                1
-              }
-              %composer.endReplaceableGroup()
-              tmp0_group
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-            @Composable
-            @NonRestartableComposable
-            fun test2(x: KnownUnstable, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(test2):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(test2):Test.kt")
-              val tmp0_group = %composer.cache(%composer.changed(x)) {
-                1
-              }
-              %composer.endReplaceableGroup()
-              tmp0_group
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
-            @Composable
-            @NonRestartableComposable
-            fun test3(x: Uncertain, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(test3):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(test3):Test.kt")
-              val tmp0_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(x) || %changed and 0b0110 == 0b0100) {
-                1
-              }
-              %composer.endReplaceableGroup()
-              tmp0_group
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-            }
         """
     )
 
@@ -371,30 +155,6 @@
         """
             @Composable
             fun rememberFoo(a: Int, b: Int) = remember(a, b) { Foo(a, b) }
-        """,
-        """
-            @Composable
-            fun rememberFoo(a: Int, b: Int, %composer: Composer?, %changed: Int): Foo {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(rememberFoo):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val tmp0 = <block>{
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(rememberFoo):Test.kt")
-                val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(a) || %changed and 0b0110 == 0b0100 or %changed and 0b01110000 xor 0b00110000 > 32 && %composer.changed(b) || %changed and 0b00110000 == 0b00100000) {
-                  Foo(a, b)
-                }
-                %composer.endReplaceableGroup()
-                tmp1_group
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -412,54 +172,6 @@
                 A()
                 val bam = remember { Foo() }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<A()>:Test.kt")
-                  val tmp0_group = %composer.cache(false) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                val bar = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp1_group = %composer.cache(false) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp1_group
-                }
-                A(%composer, 0)
-                val bam = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp2_group = %composer.cache(false) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp2_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -476,37 +188,6 @@
                 val b = someInt()
                 val foo = remember(a, b) { Foo(a, b) }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val a = someInt()
-                val b = someInt()
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(%composer.changed(a) or %composer.changed(b)) {
-                    Foo(a, b)
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -521,35 +202,6 @@
             fun Test() {
                 val foo = remember(CInt()) { Foo() }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<CInt()...>:Test.kt")
-                  val tmp0_group = %composer.cache(%composer.changed(CInt(%composer, 0))) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -568,36 +220,6 @@
                 val bar = compositionLocalBar.current
                 val foo = remember(bar) { Foo() }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val bar = compositionLocalBar.<get-current>(%composer, 0b0110)
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<curren...>:Test.kt")
-                  val tmp0_group = %composer.cache(%composer.changed(bar)) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -615,35 +237,6 @@
             fun Test() {
                 val foo = remember(compositionLocalBar.current) { Foo() }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<curren...>:Test.kt")
-                  val tmp0_group = %composer.cache(%composer.changed(compositionLocalBar.<get-current>(%composer, 0b0110))) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -659,36 +252,6 @@
                 A()
                 val foo = remember { Foo() }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A(%composer, 0)
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<A()>:Test.kt")
-                  val tmp0_group = %composer.cache(false) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -706,42 +269,6 @@
                     val foo = remember { Foo() }
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                if (condition) {
-                  val foo = <block>{
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "C(Test)<A()>:Test.kt")
-                    val tmp0_group = %composer.cache(false) {
-                      Foo()
-                    }
-                    %composer.endReplaceableGroup()
-                    tmp0_group
-                  }
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -759,42 +286,6 @@
                     val foo = remember { Foo() }
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                if (condition) {
-                  A(%composer, 0)
-                  val foo = <block>{
-                    %composer.startReplaceableGroup(<>)
-                    sourceInformation(%composer, "C(Test)<A()>:Test.kt")
-                    val tmp0_group = %composer.cache(false) {
-                      Foo()
-                    }
-                    %composer.endReplaceableGroup()
-                    tmp0_group
-                  }
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -812,37 +303,6 @@
                     print(item)
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val <iterator> = items.iterator()
-              while (<iterator>.hasNext()) {
-                val item = <iterator>.next()
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(false) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                print(foo)
-                print(item)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(items, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -862,38 +322,6 @@
                     print(item)
                 }
             }
-        """,
-        """
-            @Composable
-            fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val <iterator> = items.iterator()
-              while (<iterator>.hasNext()) {
-                val item = <iterator>.next()
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
-                  val tmp0_group = %composer.cache(false) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                A(%composer, 0)
-                print(foo)
-                print(item)
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(items, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -908,32 +336,6 @@
                 val foo = remember { Foo() }
                 used(items)
             }
-        """,
-        """
-            @Composable
-            fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val foo = <block>{
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(Test):Test.kt")
-                val tmp0_group = %composer.cache(false) {
-                  Foo()
-                }
-                %composer.endReplaceableGroup()
-                tmp0_group
-              }
-              used(items)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(items, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -948,48 +350,6 @@
             fun Test(a: Int, b: Int, c: Bar, d: Boolean) {
                 val foo = remember(a, b, c, d) { Foo() }
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, b: Int, c: Bar, d: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
-              }
-              if (%changed and 0b0001110000000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(d)) 0b100000000000 else 0b010000000000
-              }
-              if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000 or %dirty and 0b0001110000000000 == 0b100000000000) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, b, c, d, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1004,25 +364,6 @@
             fun Test(items: Array<Bar>) {
                 val foo = remember(*items) { Foo() }
             }
-        """,
-        """
-            @Composable
-            fun Test(items: Array<Bar>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val foo = remember(*items, {
-                Foo()
-              }, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(items, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1038,40 +379,6 @@
                 val a = InlineInt(123)
                 val foo = remember(inlineInt, a) { Foo() }
             }
-        """,
-        """
-            @Composable
-            fun Test(inlineInt: InlineInt, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)P(0:InlineInt):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(inlineInt))) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val a = InlineInt(123)
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)P(0:InlineInt):Test.kt")
-                  val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(inlineInt, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1091,48 +398,6 @@
                 val d = someInt()
                 val bar = remember(c, d) { Foo(c, d) }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val a = someInt()
-                val b = someInt()
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(%composer.changed(a) or %composer.changed(b)) {
-                    Foo(a, b)
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                val c = someInt()
-                val d = someInt()
-                val bar = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp1_group = %composer.cache(%composer.changed(c) or %composer.changed(d)) {
-                    Foo(c, d)
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp1_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1148,40 +413,6 @@
                 val b = someInt()
                 val foo = remember(a, b) { Foo(a, b) }
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val b = someInt()
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %composer.changed(b)) {
-                    Foo(a, b)
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1197,31 +428,6 @@
                 val b = someInt()
                 return remember(a, b) { Foo(a, b) }
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, %composer: Composer?, %changed: Int): Foo {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              val b = someInt()
-              val tmp0 = <block>{
-                %composer.startReplaceableGroup(<>)
-                sourceInformation(%composer, "C(Test):Test.kt")
-                val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(a) || %changed and 0b0110 == 0b0100 or %composer.changed(b)) {
-                  Foo(a, b)
-                }
-                %composer.endReplaceableGroup()
-                tmp1_group
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endReplaceableGroup()
-              return tmp0
-            }
         """
     )
 
@@ -1233,40 +439,6 @@
             fun Test(a: Int) {
                 used { a }
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(<block>{
-                  %composer.startReplaceableGroup(<>)
-                  val tmpCache = %composer.cache(%composer.changed(a)) {
-                    {
-                      a
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                  tmpCache
-                })
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1280,37 +452,6 @@
             fun Test(a: Int) {
                 used(remember(a, ::effect))
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(<block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100, effect)
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                })
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1324,39 +465,6 @@
             fun Test(a: Int) {
                 used(remember(a, ::effect))
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(<block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
-                    effect()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                })
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
     @Test
@@ -1369,37 +477,6 @@
             fun Test(a: A) {
                 used(remember(a, a::value))
             }
-        """,
-        """
-            @Composable
-            fun Test(a: A, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(<block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100, a::value)
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                })
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1416,54 +493,6 @@
                 used(foo)
                 used(a)
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = someInt()
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val foo = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp0_group = %composer.cache(false) {
-                    Foo()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                used(foo)
-                used(a)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -1475,52 +504,6 @@
             fun Test(a: Int = remember { 0 }) {
                 used(a)
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = <block>{
-                      %composer.startReplaceableGroup(<>)
-                      sourceInformation(%composer, "C(Test):Test.kt")
-                      val tmp0_group = %composer.cache(false) {
-                        0
-                      }
-                      %composer.endReplaceableGroup()
-                      tmp0_group
-                    }
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(a)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -1537,82 +520,6 @@
                 used(b)
                 used(c)
             }
-        """,
-        """
-            @Composable
-            fun Test(a: Int, b: Int, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%default and 0b0100 == 0 && %composer.changed(c)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = <block>{
-                      %composer.startReplaceableGroup(<>)
-                      sourceInformation(%composer, "C(Test)<SomeCo...>:Test.kt")
-                      val tmp0_group = %composer.cache(false) {
-                        0
-                      }
-                      %composer.endReplaceableGroup()
-                      tmp0_group
-                    }
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                  if (%default and 0b0010 != 0) {
-                    b = SomeComposable(%composer, 0)
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                  if (%default and 0b0100 != 0) {
-                    c = <block>{
-                      %composer.startReplaceableGroup(<>)
-                      sourceInformation(%composer, "C(Test):Test.kt")
-                      val tmp1_group = %composer.cache(false) {
-                        0
-                      }
-                      %composer.endReplaceableGroup()
-                      tmp1_group
-                    }
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                  if (%default and 0b0100 != 0) {
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(a)
-                used(b)
-                used(c)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -1640,58 +547,6 @@
                 used(dismissModifier)
             }
         }
-        """,
-        """
-            @Composable
-            fun Test(a: Boolean, visible: Boolean, onDismiss: Function0<Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)P(!1,2)<someCo...>:Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(visible)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(onDismiss)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                if (a) {
-                  val a = someComposableValue(%composer, 0)
-                  used(a)
-                  val m = Modifier()
-                  val dismissModifier = if (visible) {
-                    m.pointerInput(Unit, <block>{
-                      %composer.startReplaceableGroup(<>)
-                      val tmpCache = %composer.cache(%composer.changedInstance(onDismiss)) {
-                        {
-                          detectTapGestures {
-                            onDismiss()
-                          }
-                        }
-                      }
-                      %composer.endReplaceableGroup()
-                      tmpCache
-                    })
-                  } else {
-                    m
-                  }
-                  used(dismissModifier)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, visible, onDismiss, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -1718,61 +573,6 @@
                 val s = remember(a, b, c) { Any() }
                 used(s)
             }
-        """,
-        expectedTransformed = """
-            @Composable
-            fun Test(a: Int, b: Foo?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%default and 0b0100 != 0) {
-                %dirty = %dirty or 0b000110000000
-              } else if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                if (%default and 0b0001 != 0) {
-                  a = 1
-                }
-                if (%default and 0b0010 != 0) {
-                  b = Foo.B
-                }
-                if (%default and 0b0100 != 0) {
-                  c = swizzle(1, 2)
-                }
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val s = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<used(s...>:Test.kt")
-                  val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000) {
-                    Any()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                used(s, %composer, 0b1000)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -1798,74 +598,11 @@
                 val s = remember(a, b, c) { Any() }
                 used(s)
             }
-        """,
-        expectedTransformed = """
-            @Composable
-            fun Test(a: Int, b: Foo?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%default and 0b0010 != 0) {
-                %dirty = %dirty or 0b00110000
-              } else if (%changed and 0b01110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
-              }
-              if (%changed and 0b001110000000 == 0) {
-                %dirty = %dirty or if (%default and 0b0100 == 0 && %composer.changed(c)) 0b000100000000 else 0b10000000
-              }
-              if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = 1
-                  }
-                  if (%default and 0b0010 != 0) {
-                    b = Foo.B
-                  }
-                  if (%default and 0b0100 != 0) {
-                    c = swizzle(1, 2)
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0100 != 0) {
-                    %dirty = %dirty and 0b001110000000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val s = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<used(s...>:Test.kt")
-                  val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000) {
-                    Any()
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                used(s, %composer, 0b1000)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
     @Test
-    fun testForEarlyExit() = verifyComposeIrTransform(
+    fun testForEarlyExit() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -1877,62 +614,6 @@
                 Text("Text ${'$'}{value.value}, ${'$'}{value2.value}")
             }
         """,
-        expectedTransformed = """
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val value = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
-                  val tmp0_group = %composer.cache(false) {
-                    mutableStateOf(
-                      value = false
-                    )
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (!value.value && !condition) {
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                  return
-                }
-                val value2 = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test):Test.kt")
-                  val tmp1_group = %composer.cache(false) {
-                    mutableStateOf(
-                      value = false
-                    )
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp1_group
-                }
-                Text("Text %{value.value}, %{value2.value}", %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
@@ -1942,7 +623,7 @@
     )
 
     @Test
-    fun testVarargsIntrinsicRemember() = verifyComposeIrTransform(
+    fun testVarargsIntrinsicRemember() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -1959,56 +640,11 @@
 
             @Composable
             fun Text(value: String) { }
-        """,
-        expectedTransformed = """
-            @Composable
-            fun Test(strings: Array<out String>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test):Test.kt")
-              val %dirty = %changed
-              %composer.startMovableGroup(<>, strings.size)
-              val <iterator> = strings.iterator()
-              while (<iterator>.hasNext()) {
-                val value = <iterator>.next()
-                %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
-              }
-              %composer.endMovableGroup()
-              if (%dirty and 0b1110 == 0) {
-                %dirty = %dirty or 0b0010
-              }
-              if (%dirty and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val show = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
-                  val tmp0_group = %composer.cache(false) {
-                    mutableStateOf(
-                      value = false
-                    )
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp0_group
-                }
-                if (show.value) {
-                  Text("Showing", %composer, 0b0110)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(*strings, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
     @Test // regression test for b/267586102
-    fun testRememberInALoop() = verifyComposeIrTransform(
+    fun testRememberInALoop() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -2024,47 +660,11 @@
 
             val count = 0
             class SomeUnstableClass(val a: Any = "abc")
-        """,
-        expectedTransformed = """
-            val content: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function3<${if (useFir) "@[ParameterName(name = 'a')] " else ""}SomeUnstableClass, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: ${if (useFir) "@[ParameterName(name = 'a')] " else ""}SomeUnstableClass, %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                %composer.startReplaceableGroup(<>)
-                val <iterator> = 0 until count.iterator()
-                while (<iterator>.hasNext()) {
-                  val index = <iterator>.next()
-                  val i = <block>{
-                    %composer.startReplaceableGroup(<>)
-                    val tmp0_group = %composer.cache(false) {
-                      index
-                    }
-                    %composer.endReplaceableGroup()
-                    tmp0_group
-                  }
-                }
-                %composer.endReplaceableGroup()
-                val a = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  val tmp1_group = %composer.cache(false) {
-                    1
-                  }
-                  %composer.endReplaceableGroup()
-                  tmp1_group
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              }
-            }
         """
     )
 
     @Test // Regression test for b/267586102 to ensure the fix doesn't insert unnecessary groups
-    fun testRememberInALoop_NoTrailingRemember() = verifyComposeIrTransform(
+    fun testRememberInALoop_NoTrailingRemember() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
@@ -2079,32 +679,6 @@
 
                 val count = 0
                 class SomeUnstableClass(val a: Any = "abc")
-            """,
-        expectedTransformed = """
-            val content: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
-            internal object ComposableSingletons%TestKt {
-              val lambda-1: Function3<${if (useFir) "@[ParameterName(name = 'a')] " else ""}SomeUnstableClass, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: ${if (useFir) "@[ParameterName(name = 'a')] " else ""}SomeUnstableClass, %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C:Test.kt")
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val <iterator> = 0 until count.iterator()
-                while (<iterator>.hasNext()) {
-                  val index = <iterator>.next()
-                  val i = <block>{
-                    %composer.startReplaceableGroup(<>)
-                    val tmp0_group = %composer.cache(false) {
-                      index
-                    }
-                    %composer.endReplaceableGroup()
-                    tmp0_group
-                  }
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              }
-            }
-        """
+            """
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
index b38de21..ef74a86 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
@@ -25,15 +25,13 @@
         unchecked: String,
         @Language("kotlin")
         checked: String,
-        expectedTransformed: String,
         dumpTree: Boolean = false
-    ) = verifyComposeIrTransform(
+    ) = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
             $checked
         """.trimIndent(),
-        expectedTransformed,
         """
             import androidx.compose.runtime.Composable
 
@@ -57,35 +55,6 @@
                 A(Foo(0))
                 A(remember { Foo(0) })
             }
-        """,
-        """
-        @Composable
-        fun Test(x: Foo, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            A(x, %composer, 0b1110 and %dirty)
-            A(Foo(0), %composer, 0)
-            A(remember({
-              Foo(0)
-            }, %composer, 0), %composer, 0b0110)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(x, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
@@ -104,27 +73,6 @@
                 A(Foo(0))
                 A(remember { Foo(0) })
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              A(x, %composer, 0b1000)
-              A(Foo(0), %composer, 0b1000)
-              A(remember({
-                Foo(0)
-              }, %composer, 0), %composer, 0b1000)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -138,27 +86,6 @@
             fun Example() {
                 A(listOf("a"))
             }
-        """,
-        """
-            @Composable
-            fun Example(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Example)<A(list...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A(listOf("a"), %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Example(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StrongSkippingModeTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StrongSkippingModeTransformTests.kt
index 32c0096..da98101 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StrongSkippingModeTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/StrongSkippingModeTransformTests.kt
@@ -38,31 +38,6 @@
             fun Test(x: Foo) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              val %dirty = %changed
-              if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -77,31 +52,6 @@
             fun Test(x: Foo) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              val %dirty = %changed
-              if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -116,31 +66,6 @@
             fun Test(x: Foo?) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Foo?, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              val %dirty = %changed
-              if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -155,44 +80,6 @@
             fun Test(x: Foo? = Foo()) {
                 A(x)
             }
-        """,
-        """
-            @Composable
-            fun Test(x: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              val %dirty = %changed
-              if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changedInstance(x)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    x = Foo()
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0001 != 0) {
-                    %dirty = %dirty and 0b1110.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(x, %composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
         """
     )
 
@@ -208,41 +95,6 @@
                     A(x as Int)
                 }
             }
-        """,
-        """
-            @StabilityInferred(parameters = 0)
-            class Holder<T>  {
-              @Composable
-              fun Test(x: T, %composer: Composer?, %changed: Int) {
-                %composer = %composer.startRestartGroup(<>)
-                sourceInformation(%composer, "C(Test)")
-                val %dirty = %changed
-                if (%changed and 0b0110 == 0) {
-                  %dirty = %dirty or if (if (%changed and 0b1000 == 0) {
-                    %composer.changed(x)
-                  } else {
-                    %composer.changedInstance(x)
-                  }
-                  ) 0b0100 else 0b0010
-                }
-                if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %dirty, -1, <>)
-                  }
-                  A(x, %composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-                val tmp0_rcvr = <this>
-                %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                  tmp0_rcvr.Test(x, %composer, updateChangedFlags(%changed or 0b0001))
-                }
-              }
-              static val %stable: Int = 0
-            }
         """
     )
 
@@ -265,100 +117,6 @@
             @Composable fun NoParams() {
                 print("Hello World")
             }
-        """,
-        """
-            @Composable
-            fun CanSkip(a: Int, b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(CanSkip)")
-              val %dirty = %changed
-              if (%default and 0b0001 != 0) {
-                %dirty = %dirty or 0b0110
-              } else if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b00110000 == 0) {
-                %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changedInstance(b)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
-                %composer.startDefaults()
-                if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
-                  if (%default and 0b0001 != 0) {
-                    a = 0
-                  }
-                  if (%default and 0b0010 != 0) {
-                    b = Foo()
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                  if (%default and 0b0010 != 0) {
-                    %dirty = %dirty and 0b01110000.inv()
-                  }
-                }
-                %composer.endDefaults()
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(a)
-                used(b)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                CanSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
-              }
-            }
-            @Composable
-            fun CannotSkip(a: Int, b: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(CannotSkip)")
-              val %dirty = %changed
-              if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b00110000 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(b)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                used(a)
-                used(b)
-                print("Hello World")
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                CannotSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun NoParams(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(NoParams)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                print("Hello World")
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                NoParams(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -373,31 +131,6 @@
             fun Test(i: Int) {
                 A(i)
             }
-        """.trimIndent(),
-        """
-            @Composable
-            fun Test(i: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              val %dirty = %changed
-              if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%composer.changed(i)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(i, null, null, %composer, 0b1110 and %dirty, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(i, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """.trimIndent()
     )
 
@@ -413,37 +146,6 @@
                 val foo = Foo(0)
                 val lambda = { foo }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val foo = Foo(0)
-                val lambda = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  val tmpCache = %composer.cache(%composer.changedInstance(foo)) {
-                    {
-                      foo
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                  tmpCache
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -462,31 +164,6 @@
                 val foo = Foo(0)
                 val lambda = { foo }
             }
-        """,
-        """
-            @Composable
-            @DontMemoize
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val foo = Foo(0)
-                val lambda = {
-                  foo
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -506,33 +183,6 @@
                 val lambda = @DontMemoize { foo }
                 Lam @DontMemoize { foo }
             }
-        """,
-        """
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val foo = Foo(0)
-                val lambda = {
-                  foo
-                }
-                Lam {
-                  foo
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """
     )
 
@@ -551,45 +201,7 @@
                     bar
                 }
             }
-        """,
         """
-            @Composable
-            fun Test(foo: Foo, bar: Bar, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)P(1)")
-              val %dirty = %changed
-              if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(foo)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b00110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(bar)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val lambda = <block>{
-                  %composer.startReplaceableGroup(<>)
-                  val tmpCache = %composer.cache(%composer.changedInstance(foo) or %composer.changed(bar)) {
-                    {
-                      foo
-                      bar
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                  tmpCache
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(foo, bar, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """.trimIndent()
     )
 
     @Test
@@ -607,48 +219,7 @@
                     bar
                 }
             }
-        """,
         """
-            @Composable
-            fun Test(foo: Foo, bar: Bar, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)P(1)")
-              val %dirty = %changed
-              if (%changed and 0b0110 == 0) {
-                %dirty = %dirty or if (%composer.changedInstance(foo)) 0b0100 else 0b0010
-              }
-              if (%changed and 0b00110000 == 0) {
-                %dirty = %dirty or if (%composer.changed(bar)) 0b00100000 else 0b00010000
-              }
-              if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                val lambda = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-                  if (%changed and 0b0011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    foo
-                    bar
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(foo, bar, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """.trimIndent()
     )
 
     @Test
@@ -668,39 +239,6 @@
                     bar
                 }
             }
-        """,
-        """
-        @Composable
-        fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            val foo = Foo(0)
-            val bar = Bar(1)
-            val lambda = <block>{
-              %composer.startReplaceableGroup(<>)
-              val tmpCache = %composer.cache(%composer.changedInstance(foo) or %composer.changed(bar)) {
-                {
-                  foo
-                  bar
-                }
-              }
-              %composer.endReplaceableGroup()
-              tmpCache
-            }
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
@@ -725,58 +263,6 @@
                     use(capture)
                 }
             }
-        """.trimIndent(),
-        """
-            @Composable
-            fun TestMemoizedFun(compute: TestFunInterface, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(TestMemoizedFun)")
-              if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                TestMemoizedFun(compute, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                val capture = 0
-                TestMemoizedFun(TestFunInterface { it: Int ->
-                  use(it)
-                }, %composer, 0b0110)
-                TestMemoizedFun(<block>{
-                  %composer.startReplaceableGroup(<>)
-                  val tmpCache = %composer.cache(%composer.changed(capture)) {
-                    TestFunInterface { it: Int ->
-                      use(capture)
-                    }
-                  }
-                  %composer.endReplaceableGroup()
-                  tmpCache
-                }, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """.trimIndent()
     )
 
@@ -789,56 +275,6 @@
             @Composable fun Test() {
                 Varargs(1, 2, 3)
             }
-        """.trimIndent(),
-        """
-            @Composable
-            fun Varargs(ints: IntArray, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Varargs)")
-              val %dirty = %changed
-              %composer.startMovableGroup(<>, ints.size)
-              val <iterator> = ints.iterator()
-              while (<iterator>.hasNext()) {
-                val value = <iterator>.next()
-                %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
-              }
-              %composer.endMovableGroup()
-              if (%dirty and 0b1110 == 0) {
-                %dirty = %dirty or 0b0010
-              }
-              if (%dirty and 0b0001 != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Varargs(*ints, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Varargs(1, 2, 3, %composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
         """.trimIndent()
     )
 
@@ -854,48 +290,6 @@
                     A(x as Int)
                 }
             }
-        """,
         """
-        @StabilityInferred(parameters = 0)
-        class Holder<T>  {
-          @Composable
-          fun Test(x: Array<out T>, %composer: Composer?, %changed: Int) {
-            %composer = %composer.startRestartGroup(<>)
-            sourceInformation(%composer, "C(Test)")
-            val %dirty = %changed
-            %composer.startMovableGroup(<>, x.size)
-            val <iterator> = x.iterator()
-            while (<iterator>.hasNext()) {
-              val value = <iterator>.next()
-              %dirty = %dirty or if (if (%changed and 0b1000 == 0) {
-                %composer.changed(value)
-              } else {
-                %composer.changedInstance(value)
-              }
-              ) 0b0100 else 0
-            }
-            %composer.endMovableGroup()
-            if (%dirty and 0b1110 == 0) {
-              %dirty = %dirty or 0b0010
-            }
-            if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %dirty, -1, <>)
-              }
-              A(x, %composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            } else {
-              %composer.skipToGroupEnd()
-            }
-            val tmp0_rcvr = <this>
-            %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-              tmp0_rcvr.Test(*x, %composer, updateChangedFlags(%changed or 0b0001))
-            }
-          }
-          static val %stable: Int = 0
-        }
-        """.trimIndent()
     )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
index 080a8cb..97b1d27 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
@@ -29,28 +29,6 @@
         fun Test() {
             Text("Hello")
         }
-        """,
-        """
-        @Composable
-        @ComposableTarget(applier = "UI")
-        fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Text("Hello", %composer, 0b0110)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
@@ -63,28 +41,6 @@
         fun Test() {
             Circle()
         }
-        """,
-        """
-        @Composable
-        @ComposableTarget(applier = "Vector")
-        fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<Circle...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Circle(%composer, 0)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
@@ -96,26 +52,6 @@
 
         @Composable
         fun Test() { }
-        """,
-        """
-        @Composable
-        fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test):Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
@@ -128,32 +64,6 @@
         fun Test(content: @Composable () -> Unit) {
           content()
         }
-        """,
-        """
-        @Composable
-        @ComposableInferredTarget(scheme = "[0[0]]")
-        fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<conten...>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            content(%composer, 0b1110 and %dirty)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
@@ -168,44 +78,6 @@
             Text("test")
           }
         }
-        """,
-        """
-        @Composable
-        @ComposableInferredTarget(scheme = "[UI[_]]")
-        fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<Row>:Test.kt")
-          if (%changed and 0b0001 != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Row(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        internal object ComposableSingletons%TestKt {
-          val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-            sourceInformation(%composer, "C<Text("...>:Test.kt")
-            if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Text("test", %composer, 0b0110)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            } else {
-              %composer.skipToGroupEnd()
-            }
-          }
-        }
         """
     )
 
@@ -220,32 +92,6 @@
             Text("test")
           }
         }
-        """,
-        """
-        @Composable
-        @ComposableInferredTarget(scheme = "[UI[_]]")
-        fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<Inline...>:Test.kt")
-          if (%changed and 0b0001 != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            InlineRow({ %composer: Composer?, %changed: Int ->
-              sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
-              Text("test", %composer, 0b0110)
-              sourceInformationMarkerEnd(%composer)
-            }, %composer, 0)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
@@ -260,44 +106,6 @@
             Text("test")
           }
         }
-        """,
-        """
-        @Composable
-        @ComposableTarget(applier = "UI")
-        fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<Wrappe...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Wrapper(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        internal object ComposableSingletons%TestKt {
-          val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-            sourceInformation(%composer, "C<Text("...>:Test.kt")
-            if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Text("test", %composer, 0b0110)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            } else {
-              %composer.skipToGroupEnd()
-            }
-          }
-        }
         """
     )
 
@@ -313,48 +121,6 @@
             Text("test")
           }
         }
-        """,
-        """
-        @Composable
-        @ComposableTarget(applier = "UI")
-        fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<Compos...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            CompositionLocalProvider(
-              content = ComposableSingletons%TestKt.lambda-1,
-              %composer = %composer,
-              %changed = 56
-            )
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        internal object ComposableSingletons%TestKt {
-          val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-            sourceInformation(%composer, "C<Text("...>:Test.kt")
-            if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Text("test", %composer, 0b0110)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            } else {
-              %composer.skipToGroupEnd()
-            }
-          }
-        }
         """
     )
 
@@ -388,137 +154,11 @@
                 Text("Test")
             }
         }
-        """,
-        """
-        interface CustomComposable {
-          @Composable
-          abstract fun call(%composer: Composer?, %changed: Int)
-        }
-        @Composable
-        @ComposableInferredTarget(scheme = "[0[0]]")
-        fun OpenCustom(content: CustomComposable, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(OpenCustom)<call()>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            content.call(%composer, 0b1110 and %dirty)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            OpenCustom(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        @ComposableInferredTarget(scheme = "[UI[UI]]")
-        fun ClosedCustom(content: CustomComposable, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(ClosedCustom)<Text("...>,<call()>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            Text("Test", %composer, 0b0110)
-            content.call(%composer, 0b1110 and %dirty)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            ClosedCustom(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        @ComposableTarget(applier = "UI")
-        fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<OpenCu...>,<Closed...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            OpenCustom(<block>{
-              class <no name provided> : CustomComposable {
-                @Composable
-                @ComposableTarget(applier = "UI")
-                override fun call(%composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>)
-                  sourceInformation(%composer, "C(call)<Text("...>:Test.kt")
-                  if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    Text("Test", %composer, 0b0110)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                  val tmp0_rcvr = <this>
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    tmp0_rcvr.call(%composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                }
-              }
-              <no name provided>()
-            }, %composer, 0)
-            ClosedCustom(<block>{
-              class <no name provided> : CustomComposable {
-                @Composable
-                @ComposableTarget(applier = "UI")
-                override fun call(%composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>)
-                  sourceInformation(%composer, "C(call)<Text("...>:Test.kt")
-                  if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    Text("Test", %composer, 0b0110)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                  val tmp0_rcvr = <this>
-                  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                    tmp0_rcvr.call(%composer, updateChangedFlags(%changed or 0b0001))
-                  }
-                }
-              }
-              <no name provided>()
-            }, %composer, 0)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
     @Test
-    fun testLetIt() = verifyComposeIrTransform(
+    fun testLetIt() = verifyGoldenComposeIrTransform(
         """
         import androidx.compose.runtime.*
 
@@ -526,50 +166,11 @@
         fun Test(content: (@Composable () -> Unit?)) {
             content?.let { it() }
         }
-        """,
-        """
-        @Composable
-        @ComposableInferredTarget(scheme = "[0[0]]")
-        fun Test(content: Function2<Composer, Int, Unit?>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)*<it()>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            val tmp0_safe_receiver = content
-            val tmp1_group = when {
-              tmp0_safe_receiver == null -> {
-                null
-              }
-              else -> {
-                val tmp0_group = tmp0_safe_receiver.let { it: Function2<Composer, Int, Unit?> ->
-                  val tmp0_return = it(%composer, 0)
-                  tmp0_return
-                }
-                tmp0_group
-              }
-            }
-            tmp1_group
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
     @Test
-    fun testOptionalParameters() = verifyComposeIrTransform(
+    fun testOptionalParameters() = verifyGoldenComposeIrTransform(
         """
         import androidx.compose.runtime.*
 
@@ -617,233 +218,11 @@
                 Leaf()
             }
         }
-        """,
-        """
-        @Composable
-        @ComposableTarget(applier = "UI")
-        fun Leaf(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Leaf):Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Leaf(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        @ComposableInferredTarget(scheme = "[0[0]]")
-        fun Wrapper(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Wrapper)<conten...>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            content(%composer, 0b1110 and %dirty)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Wrapper(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        @ComposableInferredTarget(scheme = "[0[0][0][0][0][0][0][0]]")
-        fun Optional(one: Function2<Composer, Int, Unit>?, two: Function2<Composer, Int, Unit>?, three: Function2<Composer, Int, Unit>?, four: Function2<Composer, Int, Unit>?, five: Function2<Composer, Int, Unit>?, six: Function2<Composer, Int, Unit>?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Optional)P(3,6,5,2,1,4)<one()>,<conten...>:Test.kt")
-          val %dirty = %changed
-          if (%default and 0b0001 != 0) {
-            %dirty = %dirty or 0b0110
-          } else if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(one)) 0b0100 else 0b0010
-          }
-          if (%default and 0b0010 != 0) {
-            %dirty = %dirty or 0b00110000
-          } else if (%changed and 0b01110000 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(two)) 0b00100000 else 0b00010000
-          }
-          if (%default and 0b0100 != 0) {
-            %dirty = %dirty or 0b000110000000
-          } else if (%changed and 0b001110000000 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(three)) 0b000100000000 else 0b10000000
-          }
-          if (%default and 0b1000 != 0) {
-            %dirty = %dirty or 0b110000000000
-          } else if (%changed and 0b0001110000000000 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(four)) 0b100000000000 else 0b010000000000
-          }
-          if (%default and 0b00010000 != 0) {
-            %dirty = %dirty or 0b0110000000000000
-          } else if (%changed and 0b1110000000000000 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(five)) 0b0100000000000000 else 0b0010000000000000
-          }
-          if (%default and 0b00100000 != 0) {
-            %dirty = %dirty or 0b00110000000000000000
-          } else if (%changed and 0b01110000000000000000 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(six)) 0b00100000000000000000 else 0b00010000000000000000
-          }
-          if (%default and 0b01000000 != 0) {
-            %dirty = %dirty or 0b000110000000000000000000
-          } else if (%changed and 0b001110000000000000000000 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(content)) 0b000100000000000000000000 else 0b10000000000000000000
-          }
-          if (%dirty and 0b001011011011011011011011 != 0b10010010010010010010 || !%composer.skipping) {
-            if (%default and 0b0001 != 0) {
-              one = ComposableSingletons%TestKt.lambda-1
-            }
-            if (%default and 0b0010 != 0) {
-              two = null
-            }
-            if (%default and 0b0100 != 0) {
-              three = null
-            }
-            if (%default and 0b1000 != 0) {
-              four = null
-            }
-            if (%default and 0b00010000 != 0) {
-              five = null
-            }
-            if (%default and 0b00100000 != 0) {
-              six = null
-            }
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            one(%composer, 0b1110 and %dirty)
-            two?.invoke(%composer, 0b1110 and %dirty shr 0b0011)
-            val tmp1_safe_receiver = three
-            %composer.startReplaceableGroup(<>)
-            sourceInformation(%composer, "*<it()>")
-            val tmp1_group = when {
-              tmp1_safe_receiver == null -> {
-                null
-              }
-              else -> {
-                tmp1_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
-                  it(%composer, 0)
-                }
-              }
-            }
-            %composer.endReplaceableGroup()
-            tmp1_group
-            val tmp2_safe_receiver = four
-            %composer.startReplaceableGroup(<>)
-            sourceInformation(%composer, "*<four()>")
-            val tmp2_group = when {
-              tmp2_safe_receiver == null -> {
-                null
-              }
-              else -> {
-                tmp2_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
-                  four(%composer, 0b1110 and %dirty shr 0b1001)
-                }
-              }
-            }
-            %composer.endReplaceableGroup()
-            tmp2_group
-            %composer.startReplaceableGroup(<>)
-            sourceInformation(%composer, "<five()>")
-            if (five != null) {
-              five(%composer, 0b1110 and %dirty shr 0b1100)
-            }
-            %composer.endReplaceableGroup()
-            val tmp3_safe_receiver = six
-            %composer.startReplaceableGroup(<>)
-            sourceInformation(%composer, "*<Wrappe...>")
-            val tmp3_group = when {
-              tmp3_safe_receiver == null -> {
-                null
-              }
-              else -> {
-                tmp3_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
-                  Wrapper(it, %composer, 0)
-                }
-              }
-            }
-            %composer.endReplaceableGroup()
-            tmp3_group
-            content(%composer, 0b1110 and %dirty shr 0b00010010)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Optional(one, two, three, four, five, six, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
-          }
-        }
-        @Composable
-        @ComposableTarget(applier = "UI")
-        fun UseOptional(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(UseOptional)<Option...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Optional(null, null, null, null, null, null, ComposableSingletons%TestKt.lambda-2, %composer, 0b000110000000000000000000, 0b00111111)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            UseOptional(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        internal object ComposableSingletons%TestKt {
-          val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-            sourceInformation(%composer, "C:Test.kt")
-            if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Unit
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            } else {
-              %composer.skipToGroupEnd()
-            }
-          }
-          val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-            sourceInformation(%composer, "C<Leaf()>:Test.kt")
-            if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Leaf(%composer, 0)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            } else {
-              %composer.skipToGroupEnd()
-            }
-          }
-        }
         """
     )
 
     @Test
-    fun testReceiverScope() = verifyComposeIrTransform(
+    fun testReceiverScope() = verifyGoldenComposeIrTransform(
         """
         import androidx.compose.runtime.*
         import androidx.compose.ui.layout.*
@@ -880,48 +259,11 @@
                 content = { LocalBoxScopeInstance.content() }
             )
         }
-        """,
-        """
-        @Immutable
-        interface LocalBoxScope {
-          @Stable
-          abstract fun Modifier.align(alignment: Alignment): Modifier
-        }
-        @StabilityInferred(parameters = 0)
-        object LocalBoxScopeInstance : LocalBoxScope {
-          override fun Modifier.align(alignment: Alignment): Modifier {
-            return Companion
-          }
-          static val %stable: Int = 0
-        }
-        val localBoxMeasurePolicy: MeasurePolicy = MeasurePolicy { <unused var>: List<Measurable>, constraints: Constraints ->
-          %this%MeasurePolicy.layout(
-            width = constraints.minWidth,
-            height = constraints.minHeight
-          ) {
-          }
-        }
-        @Composable
-        @ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
-        fun LocalBox(modifier: Modifier?, content: @[ExtensionFunctionType] Function3<LocalBoxScope, Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
-          %composer.startReplaceableGroup(<>)
-          sourceInformation(%composer, "CC(LocalBox)P(1)<Layout...>:Test.kt")
-          if (%default and 0b0001 != 0) {
-            modifier = Companion
-          }
-          val tmp0_measurePolicy = localBoxMeasurePolicy
-          Layout({ %composer: Composer?, %changed: Int ->
-            sourceInformationMarkerStart(%composer, <>, "C<conten...>:Test.kt")
-            content(LocalBoxScopeInstance, %composer, 0b0110 or 0b01110000 and %changed@LocalBox)
-            sourceInformationMarkerEnd(%composer)
-          }, modifier, tmp0_measurePolicy, %composer, 0b000110000000 or 0b01110000 and %changed shl 0b0011, 0)
-          %composer.endReplaceableGroup()
-        }
         """
     )
 
     @Test
-    fun testCallingLayout() = verifyComposeIrTransform(
+    fun testCallingLayout() = verifyGoldenComposeIrTransform(
         """
         import androidx.compose.runtime.*
         import androidx.compose.ui.layout.*
@@ -969,204 +311,11 @@
 
         @Composable
         fun T(value: String) { }
-        """,
-        """
-        @Composable
-        @ComposableTarget(applier = "androidx.compose.ui.UiComposable")
-        fun Test1(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test1)<Layout...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Layout({ %composer: Composer?, %changed: Int ->
-              sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
-              Unit
-              sourceInformationMarkerEnd(%composer)
-            }, null, MeasurePolicy { <unused var>: List<Measurable>, <unused var>: Constraints ->
-              error("")
-            }, %composer, 0b000110000000, 0b0010)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test1(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        @ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
-        fun Test2(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test2)<Layout...>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            Layout(content, null, MeasurePolicy { <unused var>: List<Measurable>, <unused var>: Constraints ->
-              error("")
-            }, %composer, 0b000110000000 or 0b1110 and %dirty, 0b0010)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test2(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        @ComposableTarget(applier = "androidx.compose.ui.UiComposable")
-        fun Test3(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test3)<Test1(...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Test1(%composer, 0)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test3(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        @ComposableTarget(applier = "androidx.compose.ui.UiComposable")
-        fun Test4(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test4)<BasicT...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            BasicText(AnnotatedString(
-              text = "Some text"
-            ), null, null, null, <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0b0110, 0b001111111110)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test4(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        val Local: ProvidableCompositionLocal<Int> = compositionLocalOf {
-          0
-        }
-        @Composable
-        @ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
-        fun Test5(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test5)<Compos...>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            CompositionLocalProvider(Local provides 5, composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-              sourceInformation(%composer, "C<Test1(...>,<conten...>:Test.kt")
-              if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Test1(%composer, 0)
-                content(%composer, 0b1110 and %dirty)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-            }, %composer, 0b00110000 or ProvidedValue.%stable or 0)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test5(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        @ComposableTarget(applier = "androidx.compose.ui.UiComposable")
-        fun Test6(test: String, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test6)<Compos...>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changed(test)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            CompositionLocalProvider(Local provides 6, composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-              sourceInformation(%composer, "C<T(test...>,<Test1(...>:Test.kt")
-              if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                T(test, %composer, 0b1110 and %dirty)
-                Test1(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-            }, %composer, 0b00110000 or ProvidedValue.%stable or 0)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test6(test, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        @Composable
-        fun T(value: String, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(T):Test.kt")
-          if (%changed and 0b0001 != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            T(value, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
     @Suppress("unused")
-    fun testCollectAsState() = verifyComposeIrTransform(
+    fun testCollectAsState() = verifyGoldenComposeIrTransform(
         """
             import kotlin.coroutines.*
             import kotlinx.coroutines.flow.*
@@ -1182,49 +331,11 @@
                 initial: R,
                 context: CoroutineContext = EmptyCoroutineContext
             ): State<R> = mutableStateOf(initial)
-        """,
-        """
-        @Composable
-        fun <T> StateFlow<T>.collectAsState(context: CoroutineContext?, %composer: Composer?, %changed: Int, %default: Int): State<T> {
-          %composer.startReplaceableGroup(<>)
-          sourceInformation(%composer, "C(collectAsState)<collec...>:Test.kt")
-          if (%default and 0b0001 != 0) {
-            context = EmptyCoroutineContext
-          }
-          if (isTraceInProgress()) {
-            traceEventStart(<>, %changed, -1, <>)
-          }
-          val tmp0 = collectAsState(value, context, %composer, 0b001000001000, 0)
-          if (isTraceInProgress()) {
-            traceEventEnd()
-          }
-          %composer.endReplaceableGroup()
-          return tmp0
-        }
-        @Composable
-        fun <T: R, R> Flow<T>.collectAsState(initial: R, context: CoroutineContext?, %composer: Composer?, %changed: Int, %default: Int): State<R> {
-          %composer.startReplaceableGroup(<>)
-          sourceInformation(%composer, "C(collectAsState)P(1):Test.kt")
-          if (%default and 0b0010 != 0) {
-            context = EmptyCoroutineContext
-          }
-          if (isTraceInProgress()) {
-            traceEventStart(<>, %changed, -1, <>)
-          }
-          val tmp0 = mutableStateOf(
-            value = initial
-          )
-          if (isTraceInProgress()) {
-            traceEventEnd()
-          }
-          %composer.endReplaceableGroup()
-          return tmp0
-        }
         """
     )
 
     @Test
-    fun testRememberUpdatedState() = verifyComposeIrTransform(
+    fun testRememberUpdatedState() = verifyGoldenComposeIrTransform(
         source = """
         import androidx.compose.runtime.*
 
@@ -1244,71 +355,11 @@
         fun Defer(content: @Composable () -> Unit) { }
 
         fun UiContent(content: @Composable @ComposableTarget("UI") () -> Unit) { }
-        """,
-        expectedTransformed = """
-        @Composable
-        @ComposableInferredTarget(scheme = "[UI[UI]]")
-        fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            val updatedContent by {
-              val updatedContent%delegate = rememberUpdatedState(content, %composer, 0b1110 and %dirty)
-              get() {
-                return updatedContent%delegate.getValue(null, ::updatedContent%delegate)
-              }
-            }
-            Defer(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-              sourceInformation(%composer, "C:Test.kt")
-              if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                UiContent(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
-                  sourceInformation(%composer, "C<update...>:Test.kt")
-                  if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
-                    <get-updatedContent>()(%composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                  } else {
-                    %composer.skipToGroupEnd()
-                  }
-                }
-                )
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-            }
-            )
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(content, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
         """
     )
 
     @Test
-    fun testAddingComposablesToAList() = verifyComposeIrTransform(
+    fun testAddingComposablesToAList() = verifyGoldenComposeIrTransform(
         """
         import androidx.compose.runtime.*
 
@@ -1319,31 +370,6 @@
             }
         }
         """,
-        """
-        @StabilityInferred(parameters = 0)
-        class Scope {
-          val list: IntervalList<@[ExtensionFunctionType] Function2<Scope, Int, Function2<Composer, Int, Unit>>> = IntervalList()
-          fun item(content: @[ExtensionFunctionType] Function3<Scope, Composer, Int, Unit>) {
-            list.add(1) { it: Int ->
-              composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
-                sourceInformation(%composer, "C<conten...>:Test.kt")
-                if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  content(%this%add, %composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-              }
-            }
-          }
-          static val %stable: Int = 0
-        }
-        """,
         extra = """
         class IntervalList<T> {
             fun add(size: Int, content: T) { }
@@ -1352,7 +378,7 @@
     )
 
     @Test
-    fun testCallingNullableComposableWithNull() = verifyComposeIrTransform(
+    fun testCallingNullableComposableWithNull() = verifyGoldenComposeIrTransform(
         """
         import androidx.compose.runtime.*
 
@@ -1361,27 +387,6 @@
             Widget(null)
         }
         """,
-        """
-        @Composable
-        fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<Widget...>:Test.kt")
-          if (%changed != 0 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %changed, -1, <>)
-            }
-            Widget(null, %composer, 0b0110)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(%composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        """,
         extra = """
         import androidx.compose.runtime.*
 
@@ -1403,53 +408,11 @@
               Text("Some text")
             }
         }
-        """,
-        """
-        @Composable
-        @ComposableInferredTarget(scheme = "[UI[UI[UI]]]")
-        fun Test(decorator: Function3<@[ParameterName(name = 'content')] Function2<Composer, Int, Unit>, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>)
-          sourceInformation(%composer, "C(Test)<decora...>:Test.kt")
-          val %dirty = %changed
-          if (%changed and 0b1110 == 0) {
-            %dirty = %dirty or if (%composer.changedInstance(decorator)) 0b0100 else 0b0010
-          }
-          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-            if (isTraceInProgress()) {
-              traceEventStart(<>, %dirty, -1, <>)
-            }
-            decorator(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110 or 0b01110000 and %dirty shl 0b0011)
-            if (isTraceInProgress()) {
-              traceEventEnd()
-            }
-          } else {
-            %composer.skipToGroupEnd()
-          }
-          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-            Test(decorator, %composer, updateChangedFlags(%changed or 0b0001))
-          }
-        }
-        internal object ComposableSingletons%TestKt {
-          val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
-            sourceInformation(%composer, "C<Text("...>:Test.kt")
-            if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              Text("Some text", %composer, 0b0110)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-            } else {
-              %composer.skipToGroupEnd()
-            }
-          }
-        }
         """
     )
 
     @Test
-    fun testFileScoped() = verifyComposeIrTransform(
+    fun testFileScoped() = verifyGoldenComposeIrTransform(
         source = """
             @file:NComposable
 
@@ -1466,46 +429,6 @@
             }
 
         """,
-        expectedTransformed = """
-            @Composable
-            fun NFromFile(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(NFromFile)<Open()>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                Open(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                NFromFile(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @Composable
-            fun NFromInference(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(NFromInference)<N()>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                N(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                NFromInference(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         extra = """
             import androidx.compose.runtime.*
 
@@ -1525,35 +448,13 @@
     )
 
     @Test
-    fun testCrossfileFileScope() = verifyComposeIrTransform(
+    fun testCrossfileFileScope() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.*
 
             @Composable
             fun InferN() { N() }
         """,
-        expectedTransformed = """
-            @Composable
-            @ComposableTarget(applier = "NComposable")
-            fun InferN(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(InferN)<N()>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                N(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                InferN(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         extra = """
             @file:NComposable
 
@@ -1574,7 +475,7 @@
     )
 
     @Test
-    fun testInferringTargetFromAncestorMethod() = verifyComposeIrTransform(
+    fun testInferringTargetFromAncestorMethod() = verifyGoldenComposeIrTransform(
         source = """
             import androidx.compose.runtime.Composable
             import androidx.compose.runtime.ComposableTarget
@@ -1591,63 +492,11 @@
                 OpenTarget()
               }
             }
-        """,
-        expectedTransformed = """
-            @Composable
-            @ComposableOpenTarget(index = 0)
-            fun OpenTarget(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(OpenTarget):Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                OpenTarget(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-            @StabilityInferred(parameters = 0)
-            abstract class Base {
-              @Composable
-              @ComposableTarget(applier = "N")
-              abstract fun Compose(%composer: Composer?, %changed: Int)
-              static val %stable: Int = 0
-            }
-            @StabilityInferred(parameters = 0)
-            class Valid : Base {
-              @Composable
-              override fun Compose(%composer: Composer?, %changed: Int) {
-                %composer = %composer.startRestartGroup(<>)
-                sourceInformation(%composer, "C(Compose)<OpenTa...>:Test.kt")
-                if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  OpenTarget(%composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-                val tmp0_rcvr = <this>
-                %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                  tmp0_rcvr.Compose(%composer, updateChangedFlags(%changed or 0b0001))
-                }
-              }
-              static val %stable: Int = 0
-            }
         """
-        )
+    )
 
-    private fun verify(source: String, expected: String) =
-        verifyComposeIrTransform(source, expected, baseDefinition)
+    private fun verify(source: String) =
+        verifyGoldenComposeIrTransform(source, baseDefinition)
 
     private val baseDefinition = """
         import androidx.compose.runtime.Composable
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
index 71f679b..ca33b01 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
@@ -28,7 +28,7 @@
  */
 class TraceInformationTest(useFir: Boolean) : AbstractIrTransformTest(useFir) {
     @Test
-    fun testBasicComposableFunctions() = verifyComposeIrTransform(
+    fun testBasicComposableFunctions() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.Composable
 
@@ -39,55 +39,11 @@
             @Composable
             fun C() { A().B(1337) }
         """,
-        """
-            @StabilityInferred(parameters = 0)
-            class A {
-              @Composable
-              fun B(x: Int, %composer: Composer?, %changed: Int) {
-                %composer = %composer.startRestartGroup(<>)
-                sourceInformation(%composer, "C(B):Test.kt")
-                if (%changed and 0b0001 != 0 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
-                } else {
-                  %composer.skipToGroupEnd()
-                }
-                val tmp0_rcvr = <this>
-                %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                  tmp0_rcvr.B(x, %composer, updateChangedFlags(%changed or 0b0001))
-                }
-              }
-              static val %stable: Int = 0
-            }
-            @Composable
-            fun C(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(C)<B(1337...>:Test.kt")
-              if (%changed != 0 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
-                A().B(1337, %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                C(%composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
         truncateTracingInfoMode = TruncateTracingInfoMode.TRUNCATE_KEY
     )
 
     @Test
-    fun testReadOnlyComposable() = verifyComposeIrTransform(
+    fun testReadOnlyComposable() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -100,40 +56,11 @@
                     return a
                 }
             }
-        """,
-        """
-            @Composable
-            @ReadOnlyComposable
-            internal fun someFun(a: Boolean, %composer: Composer?, %changed: Int): Boolean {
-              sourceInformationMarkerStart(%composer, <>, "C(someFun):Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
-              if (a) {
-                val tmp0_return = a
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                sourceInformationMarkerEnd(%composer)
-                return tmp0_return
-              } else {
-                val tmp1_return = a
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-                sourceInformationMarkerEnd(%composer)
-                return tmp1_return
-              }
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
-              sourceInformationMarkerEnd(%composer)
-            }
         """
     )
 
     @Test
-    fun testInlineFunctionsDonotGenerateTraceMarkers() = verifyComposeIrTransform(
+    fun testInlineFunctionsDonotGenerateTraceMarkers() = verifyGoldenComposeIrTransform(
         """
             import androidx.compose.runtime.*
 
@@ -152,58 +79,6 @@
             }
         """,
         """
-            @Composable
-            @ComposableInferredTarget(scheme = "[0[0]]")
-            fun Wrapper(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>)
-              sourceInformation(%composer, "CC(Wrapper)<conten...>:Test.kt")
-              content(%composer, 0b1110 and %changed)
-              %composer.endReplaceableGroup()
-            }
-            @Composable
-            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>)
-              sourceInformation(%composer, "C(Test)<A()>,<Wrappe...>,<A()>:Test.kt")
-              val tmp0_marker = %composer.currentMarker
-              val %dirty = %changed
-              if (%changed and 0b1110 == 0) {
-                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
-              }
-              if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %dirty, -1, <>)
-                }
-                A(%composer, 0)
-                Wrapper({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>)
-                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
-                  A(%composer, 0)
-                  if (!condition) {
-                    %composer.endToMarker(tmp0_marker)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
-                    %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
-                      Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-                    }
-                    return
-                  }
-                  A(%composer, 0)
-                  %composer.endReplaceableGroup()
-                }, %composer, 0)
-                A(%composer, 0)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
-              } else {
-                %composer.skipToGroupEnd()
-              }
-              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
-                Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
-              }
-            }
-        """,
-        """
             import androidx.compose.runtime.*
 
             @Composable
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCallWithUnstableFinalClassInSameModule\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCallWithUnstableFinalClassInSameModule\133useFir = false\135.txt"
new file mode 100644
index 0000000..83c98ae
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCallWithUnstableFinalClassInSameModule\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class Foo(var bar: Int = 0)
+@Composable fun A(y: Int, x: Foo) {
+    used(y)
+    B(x)
+}
+@Composable fun B(x: Any) {
+    used(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo(var bar: Int = 0) {
+  static val %stable: Int = 8
+}
+@Composable
+fun A(y: Int, x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)P(1)<B(x)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(y)
+  B(x, %composer, 0b1000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(x: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(x)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCallWithUnstableFinalClassInSameModule\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCallWithUnstableFinalClassInSameModule\133useFir = true\135.txt"
new file mode 100644
index 0000000..83c98ae
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCallWithUnstableFinalClassInSameModule\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class Foo(var bar: Int = 0)
+@Composable fun A(y: Int, x: Foo) {
+    used(y)
+    B(x)
+}
+@Composable fun B(x: Any) {
+    used(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo(var bar: Int = 0) {
+  static val %stable: Int = 8
+}
+@Composable
+fun A(y: Int, x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)P(1)<B(x)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(y)
+  B(x, %composer, 0b1000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(x: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(x)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..5f19ab4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCall\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class Foo
+@Composable fun A(y: Int, x: Any) {
+    used(y)
+    B(x)
+}
+@Composable fun B(x: Any) {
+    used(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  static val %stable: Int = 0
+}
+@Composable
+fun A(y: Int, x: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)P(1)<B(x)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(y)
+  B(x, %composer, 0b1000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(x: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(x)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..5f19ab4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testComposableCall\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class Foo
+@Composable fun A(y: Int, x: Any) {
+    used(y)
+    B(x)
+}
+@Composable fun B(x: Any) {
+    used(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  static val %stable: Int = 0
+}
+@Composable
+fun A(y: Int, x: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)P(1)<B(x)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(y)
+  B(x, %composer, 0b1000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(x: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(x)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClassAcrossModules\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClassAcrossModules\133useFir = false\135.txt"
new file mode 100644
index 0000000..1fab519
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClassAcrossModules\133useFir = false\135.txt"
@@ -0,0 +1,32 @@
+//
+// Source
+// ------------------------------------------
+
+import a.*
+import androidx.compose.runtime.Composable
+
+@Composable fun A(y: Any) {
+    used(y)
+    A(Wrapper(Foo()))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(y: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<A(Wrap...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(y)
+  A(Wrapper(Foo()), %composer, Wrapper.%stable)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClassAcrossModules\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClassAcrossModules\133useFir = true\135.txt"
new file mode 100644
index 0000000..1fab519
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClassAcrossModules\133useFir = true\135.txt"
@@ -0,0 +1,32 @@
+//
+// Source
+// ------------------------------------------
+
+import a.*
+import androidx.compose.runtime.Composable
+
+@Composable fun A(y: Any) {
+    used(y)
+    A(Wrapper(Foo()))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(y: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<A(Wrap...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(y)
+  A(Wrapper(Foo()), %composer, Wrapper.%stable)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClass\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClass\133useFir = false\135.txt"
new file mode 100644
index 0000000..9ccd959
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClass\133useFir = false\135.txt"
@@ -0,0 +1,14 @@
+//
+// Source
+// ------------------------------------------
+
+class Foo
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClass\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClass\133useFir = true\135.txt"
new file mode 100644
index 0000000..9ccd959
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testEmptyClass\133useFir = true\135.txt"
@@ -0,0 +1,14 @@
+//
+// Source
+// ------------------------------------------
+
+class Foo
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testLocalParameterBasedTypeParameterSubstitution\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testLocalParameterBasedTypeParameterSubstitution\133useFir = false\135.txt"
new file mode 100644
index 0000000..5ee1039
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testLocalParameterBasedTypeParameterSubstitution\133useFir = false\135.txt"
@@ -0,0 +1,104 @@
+//
+// Source
+// ------------------------------------------
+
+import a.*
+import androidx.compose.runtime.Composable
+
+@Composable fun <V> B(value: V) {
+    A(Wrapper(value))
+}
+@Composable fun <T> X(items: List<T>, itemContent: @Composable (T) -> Unit) {
+    for (item in items) itemContent(item)
+}
+@Composable fun C(items: List<String>) {
+    X(items) { item ->
+        A(item)
+        A(Wrapper(item))
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun <V> B(value: V, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B)<A(Wrap...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(Wrapper(value), %composer, Wrapper.%stable or 0b1000 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun <T> X(items: List<T>, itemContent: Function3<T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(X)P(1)*<itemCo...>:Test.kt")
+  val %dirty = %changed
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %dirty, -1, <>)
+  }
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    itemContent(item, %composer, 0b01110000 and %dirty)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    X(items, itemContent, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun C(items: List<String>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(C)<X(item...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  X(items, ComposableSingletons%TestKt.lambda-1, %composer, 0b00111000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    C(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<String, Composer, Int, Unit> = composableLambdaInstance(<>, false) { item: String, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A(item...>,<A(Wrap...>:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(item)) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(item, %composer, 0b1110 and %dirty)
+      A(Wrapper(item), %composer, Wrapper.%stable or 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testLocalParameterBasedTypeParameterSubstitution\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testLocalParameterBasedTypeParameterSubstitution\133useFir = true\135.txt"
new file mode 100644
index 0000000..5ee1039
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testLocalParameterBasedTypeParameterSubstitution\133useFir = true\135.txt"
@@ -0,0 +1,104 @@
+//
+// Source
+// ------------------------------------------
+
+import a.*
+import androidx.compose.runtime.Composable
+
+@Composable fun <V> B(value: V) {
+    A(Wrapper(value))
+}
+@Composable fun <T> X(items: List<T>, itemContent: @Composable (T) -> Unit) {
+    for (item in items) itemContent(item)
+}
+@Composable fun C(items: List<String>) {
+    X(items) { item ->
+        A(item)
+        A(Wrapper(item))
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun <V> B(value: V, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B)<A(Wrap...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(Wrapper(value), %composer, Wrapper.%stable or 0b1000 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun <T> X(items: List<T>, itemContent: Function3<T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(X)P(1)*<itemCo...>:Test.kt")
+  val %dirty = %changed
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %dirty, -1, <>)
+  }
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    itemContent(item, %composer, 0b01110000 and %dirty)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    X(items, itemContent, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun C(items: List<String>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(C)<X(item...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  X(items, ComposableSingletons%TestKt.lambda-1, %composer, 0b00111000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    C(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<String, Composer, Int, Unit> = composableLambdaInstance(<>, false) { item: String, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A(item...>,<A(Wrap...>:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(item)) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(item, %composer, 0b1110 and %dirty)
+      A(Wrapper(item), %composer, Wrapper.%stable or 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testSingleVarVersusValProperty\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testSingleVarVersusValProperty\133useFir = false\135.txt"
new file mode 100644
index 0000000..a47c6f8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testSingleVarVersusValProperty\133useFir = false\135.txt"
@@ -0,0 +1,19 @@
+//
+// Source
+// ------------------------------------------
+
+class Stable(val bar: Int)
+class Unstable(var bar: Int)
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Stable(val bar: Int) {
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class Unstable(var bar: Int) {
+  static val %stable: Int = 8
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testSingleVarVersusValProperty\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testSingleVarVersusValProperty\133useFir = true\135.txt"
new file mode 100644
index 0000000..a47c6f8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testSingleVarVersusValProperty\133useFir = true\135.txt"
@@ -0,0 +1,19 @@
+//
+// Source
+// ------------------------------------------
+
+class Stable(val bar: Int)
+class Unstable(var bar: Int)
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Stable(val bar: Int) {
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class Unstable(var bar: Int) {
+  static val %stable: Int = 8
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypesInSameModule\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypesInSameModule\133useFir = false\135.txt"
new file mode 100644
index 0000000..8a059c2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypesInSameModule\133useFir = false\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import a.*
+import androidx.compose.runtime.Composable
+
+class X<T>(val p1: List<T>)
+class StableDelegateProp {
+    var p1 by StableDelegate()
+}
+class UnstableDelegateProp {
+    var p1 by UnstableDelegate()
+}
+@Composable fun A(y: Any) {
+    used(y)
+    A(X(listOf(StableClass())))
+    A(StableDelegateProp())
+    A(UnstableDelegateProp())
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class X<T> (val p1: List<T>) {
+  static val %stable: Int = 8
+}
+@StabilityInferred(parameters = 0)
+class StableDelegateProp {
+  var p1: StableDelegate = StableDelegate()
+    get() {
+      return <this>.p1%delegate.getValue(<this>, ::p1)
+    }
+    set(value) {
+      <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class UnstableDelegateProp {
+  var p1: UnstableDelegate = UnstableDelegate()
+    get() {
+      return <this>.p1%delegate.getValue(<this>, ::p1)
+    }
+    set(value) {
+      <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
+    }
+  static val %stable: Int = UnstableDelegate.%stable
+}
+@Composable
+fun A(y: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<A(X(li...>,<A(Stab...>,<A(Unst...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(y)
+  A(X(listOf(StableClass())), %composer, 0b1000)
+  A(StableDelegateProp(), %composer, 0)
+  A(UnstableDelegateProp(), %composer, UnstableDelegate.%stable)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypesInSameModule\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypesInSameModule\133useFir = true\135.txt"
new file mode 100644
index 0000000..8a059c2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypesInSameModule\133useFir = true\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import a.*
+import androidx.compose.runtime.Composable
+
+class X<T>(val p1: List<T>)
+class StableDelegateProp {
+    var p1 by StableDelegate()
+}
+class UnstableDelegateProp {
+    var p1 by UnstableDelegate()
+}
+@Composable fun A(y: Any) {
+    used(y)
+    A(X(listOf(StableClass())))
+    A(StableDelegateProp())
+    A(UnstableDelegateProp())
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class X<T> (val p1: List<T>) {
+  static val %stable: Int = 8
+}
+@StabilityInferred(parameters = 0)
+class StableDelegateProp {
+  var p1: StableDelegate = StableDelegate()
+    get() {
+      return <this>.p1%delegate.getValue(<this>, ::p1)
+    }
+    set(value) {
+      <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class UnstableDelegateProp {
+  var p1: UnstableDelegate = UnstableDelegate()
+    get() {
+      return <this>.p1%delegate.getValue(<this>, ::p1)
+    }
+    set(value) {
+      <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
+    }
+  static val %stable: Int = UnstableDelegate.%stable
+}
+@Composable
+fun A(y: Any, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<A(X(li...>,<A(Stab...>,<A(Unst...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(y)
+  A(X(listOf(StableClass())), %composer, 0b1000)
+  A(StableDelegateProp(), %composer, 0)
+  A(UnstableDelegateProp(), %composer, UnstableDelegate.%stable)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypes\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypes\133useFir = false\135.txt"
new file mode 100644
index 0000000..ec1c909
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypes\133useFir = false\135.txt"
@@ -0,0 +1,77 @@
+//
+// Source
+// ------------------------------------------
+
+import a.*
+import androidx.compose.runtime.Composable
+
+@Composable fun A(y: Any? = null) {
+    used(y)
+    A()
+    A(EmptyClass())
+    A(SingleStableValInt(123))
+    A(SingleStableVal(StableClass()))
+    A(SingleParamProp(StableClass()))
+    A(SingleParamProp(UnstableClass()))
+    A(SingleParamNonProp(StableClass()))
+    A(SingleParamNonProp(UnstableClass()))
+    A(DoubleParamSingleProp(StableClass(), StableClass()))
+    A(DoubleParamSingleProp(UnstableClass(), StableClass()))
+    A(DoubleParamSingleProp(StableClass(), UnstableClass()))
+    A(DoubleParamSingleProp(UnstableClass(), UnstableClass()))
+    A(X(listOf(StableClass())))
+    A(X(listOf(StableClass())))
+    A(NonBackingFieldUnstableVal())
+    A(NonBackingFieldUnstableVar())
+    A(StableDelegateProp())
+    A(UnstableDelegateProp())
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(y: Any?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<A()>,<A(Empt...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(X(li...>,<A(X(li...>,<A(NonB...>,<A(NonB...>,<A(Stab...>,<A(Unst...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%default and 0b0001 != 0b0001 || %dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      y = null
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(y)
+    A(null, %composer, 0, 0b0001)
+    A(EmptyClass(), %composer, EmptyClass.%stable, 0)
+    A(SingleStableValInt(123), %composer, SingleStableValInt.%stable, 0)
+    A(SingleStableVal(StableClass()), %composer, SingleStableVal.%stable, 0)
+    A(SingleParamProp(StableClass()), %composer, SingleParamProp.%stable or StableClass.%stable, 0)
+    A(SingleParamProp(UnstableClass()), %composer, SingleParamProp.%stable or UnstableClass.%stable, 0)
+    A(SingleParamNonProp(StableClass()), %composer, SingleParamNonProp.%stable, 0)
+    A(SingleParamNonProp(UnstableClass()), %composer, SingleParamNonProp.%stable, 0)
+    A(DoubleParamSingleProp(StableClass(), StableClass()), %composer, DoubleParamSingleProp.%stable or StableClass.%stable, 0)
+    A(DoubleParamSingleProp(UnstableClass(), StableClass()), %composer, DoubleParamSingleProp.%stable or UnstableClass.%stable, 0)
+    A(DoubleParamSingleProp(StableClass(), UnstableClass()), %composer, DoubleParamSingleProp.%stable or StableClass.%stable, 0)
+    A(DoubleParamSingleProp(UnstableClass(), UnstableClass()), %composer, DoubleParamSingleProp.%stable or UnstableClass.%stable, 0)
+    A(X(listOf(StableClass())), %composer, X.%stable, 0)
+    A(X(listOf(StableClass())), %composer, X.%stable, 0)
+    A(NonBackingFieldUnstableVal(), %composer, NonBackingFieldUnstableVal.%stable, 0)
+    A(NonBackingFieldUnstableVar(), %composer, NonBackingFieldUnstableVar.%stable, 0)
+    A(StableDelegateProp(), %composer, StableDelegateProp.%stable, 0)
+    A(UnstableDelegateProp(), %composer, UnstableDelegateProp.%stable, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypes\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypes\133useFir = true\135.txt"
new file mode 100644
index 0000000..ec1c909
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityPropagationOfVariousTypes\133useFir = true\135.txt"
@@ -0,0 +1,77 @@
+//
+// Source
+// ------------------------------------------
+
+import a.*
+import androidx.compose.runtime.Composable
+
+@Composable fun A(y: Any? = null) {
+    used(y)
+    A()
+    A(EmptyClass())
+    A(SingleStableValInt(123))
+    A(SingleStableVal(StableClass()))
+    A(SingleParamProp(StableClass()))
+    A(SingleParamProp(UnstableClass()))
+    A(SingleParamNonProp(StableClass()))
+    A(SingleParamNonProp(UnstableClass()))
+    A(DoubleParamSingleProp(StableClass(), StableClass()))
+    A(DoubleParamSingleProp(UnstableClass(), StableClass()))
+    A(DoubleParamSingleProp(StableClass(), UnstableClass()))
+    A(DoubleParamSingleProp(UnstableClass(), UnstableClass()))
+    A(X(listOf(StableClass())))
+    A(X(listOf(StableClass())))
+    A(NonBackingFieldUnstableVal())
+    A(NonBackingFieldUnstableVar())
+    A(StableDelegateProp())
+    A(UnstableDelegateProp())
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(y: Any?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<A()>,<A(Empt...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(X(li...>,<A(X(li...>,<A(NonB...>,<A(NonB...>,<A(Stab...>,<A(Unst...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%default and 0b0001 != 0b0001 || %dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      y = null
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(y)
+    A(null, %composer, 0, 0b0001)
+    A(EmptyClass(), %composer, EmptyClass.%stable, 0)
+    A(SingleStableValInt(123), %composer, SingleStableValInt.%stable, 0)
+    A(SingleStableVal(StableClass()), %composer, SingleStableVal.%stable, 0)
+    A(SingleParamProp(StableClass()), %composer, SingleParamProp.%stable or StableClass.%stable, 0)
+    A(SingleParamProp(UnstableClass()), %composer, SingleParamProp.%stable or UnstableClass.%stable, 0)
+    A(SingleParamNonProp(StableClass()), %composer, SingleParamNonProp.%stable, 0)
+    A(SingleParamNonProp(UnstableClass()), %composer, SingleParamNonProp.%stable, 0)
+    A(DoubleParamSingleProp(StableClass(), StableClass()), %composer, DoubleParamSingleProp.%stable or StableClass.%stable, 0)
+    A(DoubleParamSingleProp(UnstableClass(), StableClass()), %composer, DoubleParamSingleProp.%stable or UnstableClass.%stable, 0)
+    A(DoubleParamSingleProp(StableClass(), UnstableClass()), %composer, DoubleParamSingleProp.%stable or StableClass.%stable, 0)
+    A(DoubleParamSingleProp(UnstableClass(), UnstableClass()), %composer, DoubleParamSingleProp.%stable or UnstableClass.%stable, 0)
+    A(X(listOf(StableClass())), %composer, X.%stable, 0)
+    A(X(listOf(StableClass())), %composer, X.%stable, 0)
+    A(NonBackingFieldUnstableVal(), %composer, NonBackingFieldUnstableVal.%stable, 0)
+    A(NonBackingFieldUnstableVar(), %composer, NonBackingFieldUnstableVar.%stable, 0)
+    A(StableDelegateProp(), %composer, StableDelegateProp.%stable, 0)
+    A(UnstableDelegateProp(), %composer, UnstableDelegateProp.%stable, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(y, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityTransformOfVariousTypes\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityTransformOfVariousTypes\133useFir = false\135.txt"
new file mode 100644
index 0000000..6efd971
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityTransformOfVariousTypes\133useFir = false\135.txt"
@@ -0,0 +1,141 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Stable
+import kotlin.reflect.KProperty
+
+@Stable
+class StableDelegate {
+    operator fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
+    }
+    operator fun getValue(thisObj: Any?, property: KProperty<*>): Int {
+        return 10
+    }
+}
+
+class UnstableDelegate {
+    var value: Int = 0
+    operator fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
+        this.value = value
+    }
+    operator fun getValue(thisObj: Any?, property: KProperty<*>): Int {
+        return 10
+    }
+}
+class Unstable { var value: Int = 0 }
+class EmptyClass
+class SingleStableVal(val p1: Int)
+class SingleParamProp<T>(val p1: T)
+class SingleParamNonProp<T>(p1: T) { val p2 = p1.hashCode() }
+class DoubleParamSingleProp<T, V>(val p1: T, p2: V) { val p3 = p2.hashCode() }
+class X<T>(val p1: List<T>)
+class NonBackingFieldUnstableProp {
+    val p1: Unstable get() { TODO() }
+}
+class NonBackingFieldUnstableVarProp {
+    var p1: Unstable
+        get() { TODO() }
+        set(value) { }
+}
+class StableDelegateProp {
+    var p1 by StableDelegate()
+}
+class UnstableDelegateProp {
+    var p1 by UnstableDelegate()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Stable
+class StableDelegate {
+  fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) { }
+  fun getValue(thisObj: Any?, property: KProperty<*>): Int {
+    return 10
+  }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class UnstableDelegate {
+  var value: Int = 0
+  fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
+    value = value
+  }
+  fun getValue(thisObj: Any?, property: KProperty<*>): Int {
+    return 10
+  }
+  static val %stable: Int = 8
+}
+@StabilityInferred(parameters = 0)
+class Unstable {
+  var value: Int = 0
+  static val %stable: Int = 8
+}
+@StabilityInferred(parameters = 0)
+class EmptyClass {
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class SingleStableVal(val p1: Int) {
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 1)
+class SingleParamProp<T> (val p1: T) {
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class SingleParamNonProp<T> (p1: T) {
+  val p2: Int = p1.hashCode()
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 1)
+class DoubleParamSingleProp<T, V> (val p1: T, p2: V) {
+  val p3: Int = p2.hashCode()
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class X<T> (val p1: List<T>) {
+  static val %stable: Int = 8
+}
+@StabilityInferred(parameters = 0)
+class NonBackingFieldUnstableProp {
+  val p1: Unstable
+    get() {
+      TODO()
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class NonBackingFieldUnstableVarProp {
+  var p1: Unstable
+    get() {
+      TODO()
+    }
+    set(value) {
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class StableDelegateProp {
+  var p1: StableDelegate = StableDelegate()
+    get() {
+      return <this>.p1%delegate.getValue(<this>, ::p1)
+    }
+    set(value) {
+      <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class UnstableDelegateProp {
+  var p1: UnstableDelegate = UnstableDelegate()
+    get() {
+      return <this>.p1%delegate.getValue(<this>, ::p1)
+    }
+    set(value) {
+      <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
+    }
+  static val %stable: Int = 8
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityTransformOfVariousTypes\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityTransformOfVariousTypes\133useFir = true\135.txt"
new file mode 100644
index 0000000..6efd971
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ClassStabilityTransformTests/testStabilityTransformOfVariousTypes\133useFir = true\135.txt"
@@ -0,0 +1,141 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Stable
+import kotlin.reflect.KProperty
+
+@Stable
+class StableDelegate {
+    operator fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
+    }
+    operator fun getValue(thisObj: Any?, property: KProperty<*>): Int {
+        return 10
+    }
+}
+
+class UnstableDelegate {
+    var value: Int = 0
+    operator fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
+        this.value = value
+    }
+    operator fun getValue(thisObj: Any?, property: KProperty<*>): Int {
+        return 10
+    }
+}
+class Unstable { var value: Int = 0 }
+class EmptyClass
+class SingleStableVal(val p1: Int)
+class SingleParamProp<T>(val p1: T)
+class SingleParamNonProp<T>(p1: T) { val p2 = p1.hashCode() }
+class DoubleParamSingleProp<T, V>(val p1: T, p2: V) { val p3 = p2.hashCode() }
+class X<T>(val p1: List<T>)
+class NonBackingFieldUnstableProp {
+    val p1: Unstable get() { TODO() }
+}
+class NonBackingFieldUnstableVarProp {
+    var p1: Unstable
+        get() { TODO() }
+        set(value) { }
+}
+class StableDelegateProp {
+    var p1 by StableDelegate()
+}
+class UnstableDelegateProp {
+    var p1 by UnstableDelegate()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Stable
+class StableDelegate {
+  fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) { }
+  fun getValue(thisObj: Any?, property: KProperty<*>): Int {
+    return 10
+  }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class UnstableDelegate {
+  var value: Int = 0
+  fun setValue(thisObj: Any?, property: KProperty<*>, value: Int) {
+    value = value
+  }
+  fun getValue(thisObj: Any?, property: KProperty<*>): Int {
+    return 10
+  }
+  static val %stable: Int = 8
+}
+@StabilityInferred(parameters = 0)
+class Unstable {
+  var value: Int = 0
+  static val %stable: Int = 8
+}
+@StabilityInferred(parameters = 0)
+class EmptyClass {
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class SingleStableVal(val p1: Int) {
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 1)
+class SingleParamProp<T> (val p1: T) {
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class SingleParamNonProp<T> (p1: T) {
+  val p2: Int = p1.hashCode()
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 1)
+class DoubleParamSingleProp<T, V> (val p1: T, p2: V) {
+  val p3: Int = p2.hashCode()
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class X<T> (val p1: List<T>) {
+  static val %stable: Int = 8
+}
+@StabilityInferred(parameters = 0)
+class NonBackingFieldUnstableProp {
+  val p1: Unstable
+    get() {
+      TODO()
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class NonBackingFieldUnstableVarProp {
+  var p1: Unstable
+    get() {
+      TODO()
+    }
+    set(value) {
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class StableDelegateProp {
+  var p1: StableDelegate = StableDelegate()
+    get() {
+      return <this>.p1%delegate.getValue(<this>, ::p1)
+    }
+    set(value) {
+      <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class UnstableDelegateProp {
+  var p1: UnstableDelegate = UnstableDelegate()
+    get() {
+      return <this>.p1%delegate.getValue(<this>, ::p1)
+    }
+    set(value) {
+      <this>.p1%delegate.setValue(<this>, ::p1, <set-?>)
+    }
+  static val %stable: Int = 8
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testAbstractComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testAbstractComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..8eb9388
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testAbstractComposable\133useFir = false\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+abstract class BaseFoo {
+    @NonRestartableComposable
+    @Composable
+    abstract fun bar()
+}
+
+class FooImpl : BaseFoo() {
+    @NonRestartableComposable
+    @Composable
+    override fun bar() {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+abstract class BaseFoo {
+  @NonRestartableComposable
+  @Composable
+  abstract fun bar(%composer: Composer?, %changed: Int)
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class FooImpl : BaseFoo {
+  @NonRestartableComposable
+  @Composable
+  override fun bar(%composer: Composer?, %changed: Int) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(bar):Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testAbstractComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testAbstractComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..8eb9388
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testAbstractComposable\133useFir = true\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+abstract class BaseFoo {
+    @NonRestartableComposable
+    @Composable
+    abstract fun bar()
+}
+
+class FooImpl : BaseFoo() {
+    @NonRestartableComposable
+    @Composable
+    override fun bar() {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+abstract class BaseFoo {
+  @NonRestartableComposable
+  @Composable
+  abstract fun bar(%composer: Composer?, %changed: Int)
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class FooImpl : BaseFoo {
+  @NonRestartableComposable
+  @Composable
+  override fun bar(%composer: Composer?, %changed: Int) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(bar):Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCallingProperties\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCallingProperties\133useFir = false\135.txt"
new file mode 100644
index 0000000..28702a3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCallingProperties\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+val bar: Int @Composable get() { return 123 }
+
+@NonRestartableComposable @Composable fun Example() {
+    bar
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val bar: Int
+  @Composable @JvmName(name = "getBar")
+  get() {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C:Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = 123
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp0
+  }
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<bar>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  <get-bar>(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCallingProperties\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCallingProperties\133useFir = true\135.txt"
new file mode 100644
index 0000000..28702a3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCallingProperties\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+val bar: Int @Composable get() { return 123 }
+
+@NonRestartableComposable @Composable fun Example() {
+    bar
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val bar: Int
+  @Composable @JvmName(name = "getBar")
+  get() {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C:Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = 123
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp0
+  }
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<bar>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  <get-bar>(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCircularCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCircularCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..d352454
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCircularCall\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable fun Example() {
+    Example()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<Exampl...>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Example(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCircularCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCircularCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..d352454
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testCircularCall\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable fun Example() {
+    Example()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<Exampl...>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Example(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testComposableNestedCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testComposableNestedCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..00c10f8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testComposableNestedCall\133useFir = false\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+    @Composable
+    fun composeVector(
+        composable: @Composable () -> Unit
+    ) {
+        emit {
+            emit {
+                composable()
+            }
+        }
+    }
+    @Composable
+    inline fun emit(composable: @Composable () -> Unit) {
+        composable()
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun composeVector(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(composeVector)<emit>:Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(composable)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    emit({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<emit>:Test.kt#2487m")
+      emit({ %composer: Composer?, %changed: Int ->
+        sourceInformationMarkerStart(%composer, <>, "C<compos...>:Test.kt#2487m")
+        composable(%composer, 0b1110 and %dirty)
+        sourceInformationMarkerEnd(%composer)
+      }, %composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    composeVector(composable, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun emit(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(emit)<compos...>:Test.kt#2487m")
+  composable(%composer, 0b1110 and %changed)
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testComposableNestedCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testComposableNestedCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..00c10f8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testComposableNestedCall\133useFir = true\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+    @Composable
+    fun composeVector(
+        composable: @Composable () -> Unit
+    ) {
+        emit {
+            emit {
+                composable()
+            }
+        }
+    }
+    @Composable
+    inline fun emit(composable: @Composable () -> Unit) {
+        composable()
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun composeVector(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(composeVector)<emit>:Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(composable)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    emit({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<emit>:Test.kt#2487m")
+      emit({ %composer: Composer?, %changed: Int ->
+        sourceInformationMarkerStart(%composer, <>, "C<compos...>:Test.kt#2487m")
+        composable(%composer, 0b1110 and %dirty)
+        sourceInformationMarkerEnd(%composer)
+      }, %composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    composeVector(composable, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun emit(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(emit)<compos...>:Test.kt#2487m")
+  composable(%composer, 0b1110 and %changed)
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDelegateCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDelegateCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..c1c0813
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDelegateCall\133useFir = false\135.txt"
@@ -0,0 +1,153 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+    import kotlin.reflect.KProperty
+
+    class Foo
+    @Composable
+    operator fun Foo.getValue(thisObj: Any?, property: KProperty<*>): Foo = this
+
+    class FooDelegate {
+        @Composable
+        operator fun getValue(thisObj: Any?, property: KProperty<*>): FooDelegate = this
+    }
+
+    class Bar {
+        @get:Composable
+        val foo by Foo()
+    }
+
+    @Composable
+    fun test() {
+        val foo by Foo()
+        val fooDelegate by FooDelegate()
+        val bar = Bar()
+        println(foo)
+        println(fooDelegate)
+        println(bar.foo)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  static val %stable: Int = 0
+}
+@Composable
+fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(getValue)P(1):Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = <this>
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
+@StabilityInferred(parameters = 0)
+class FooDelegate {
+  @Composable
+  fun getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): FooDelegate {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(getValue)P(1):Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = <this>
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp0
+  }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class Bar {
+  val foo: Foo = Foo()
+    @Composable @JvmName(name = "getFoo")
+    get() {
+      sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      val tmp0 = <this>.foo%delegate.getValue(<this>, ::foo, %composer, 0b001000000000 or 0b01110000 and %changed shl 0b0011)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      sourceInformationMarkerEnd(%composer)
+      return tmp0
+    }
+  static val %stable: Int = 0
+}
+@Composable
+fun test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test)*<foo>,<fooDel...>,<foo>:Test.kt#2487m")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo by {
+      val foo%delegate = Foo()
+      @Composable
+      get(%composer: Composer?, %changed: Int) {
+        sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        val tmp0 = foo%delegate.getValue(null, ::foo%delegate, %composer, 0b00110000)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        sourceInformationMarkerEnd(%composer)
+        return tmp0
+      }
+    }
+    val fooDelegate by {
+      val fooDelegate%delegate = FooDelegate()
+      @Composable
+      get(%composer: Composer?, %changed: Int) {
+        sourceInformationMarkerStart(%composer, <>, "C<FooDel...>:Test.kt#2487m")
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        val tmp0 = fooDelegate%delegate.getValue(null, ::fooDelegate%delegate, %composer, 0b0110)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        sourceInformationMarkerEnd(%composer)
+        return tmp0
+      }
+    }
+    val bar = Bar()
+    println(<get-foo>(%composer, 0))
+    println(<get-fooDelegate>(%composer, 0))
+    println(bar.<get-foo>(%composer, 0))
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDelegateCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDelegateCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..c1c0813
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDelegateCall\133useFir = true\135.txt"
@@ -0,0 +1,153 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+    import kotlin.reflect.KProperty
+
+    class Foo
+    @Composable
+    operator fun Foo.getValue(thisObj: Any?, property: KProperty<*>): Foo = this
+
+    class FooDelegate {
+        @Composable
+        operator fun getValue(thisObj: Any?, property: KProperty<*>): FooDelegate = this
+    }
+
+    class Bar {
+        @get:Composable
+        val foo by Foo()
+    }
+
+    @Composable
+    fun test() {
+        val foo by Foo()
+        val fooDelegate by FooDelegate()
+        val bar = Bar()
+        println(foo)
+        println(fooDelegate)
+        println(bar.foo)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  static val %stable: Int = 0
+}
+@Composable
+fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(getValue)P(1):Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = <this>
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
+@StabilityInferred(parameters = 0)
+class FooDelegate {
+  @Composable
+  fun getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): FooDelegate {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(getValue)P(1):Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = <this>
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp0
+  }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class Bar {
+  val foo: Foo = Foo()
+    @Composable @JvmName(name = "getFoo")
+    get() {
+      sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      val tmp0 = <this>.foo%delegate.getValue(<this>, ::foo, %composer, 0b001000000000 or 0b01110000 and %changed shl 0b0011)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      sourceInformationMarkerEnd(%composer)
+      return tmp0
+    }
+  static val %stable: Int = 0
+}
+@Composable
+fun test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test)*<foo>,<fooDel...>,<foo>:Test.kt#2487m")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo by {
+      val foo%delegate = Foo()
+      @Composable
+      get(%composer: Composer?, %changed: Int) {
+        sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        val tmp0 = foo%delegate.getValue(null, ::foo%delegate, %composer, 0b00110000)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        sourceInformationMarkerEnd(%composer)
+        return tmp0
+      }
+    }
+    val fooDelegate by {
+      val fooDelegate%delegate = FooDelegate()
+      @Composable
+      get(%composer: Composer?, %changed: Int) {
+        sourceInformationMarkerStart(%composer, <>, "C<FooDel...>:Test.kt#2487m")
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        val tmp0 = fooDelegate%delegate.getValue(null, ::fooDelegate%delegate, %composer, 0b0110)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        sourceInformationMarkerEnd(%composer)
+        return tmp0
+      }
+    }
+    val bar = Bar()
+    println(<get-foo>(%composer, 0))
+    println(<get-fooDelegate>(%composer, 0))
+    println(bar.<get-foo>(%composer, 0))
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDexNaming\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDexNaming\133useFir = false\135.txt"
new file mode 100644
index 0000000..8d77b7a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDexNaming\133useFir = false\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+val myProperty: () -> Unit @Composable get() {
+    return {  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val myProperty: Function0<Unit>
+  @Composable @JvmName(name = "getMyProperty")
+  get() {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C:Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = {
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp0
+  }
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDexNaming\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDexNaming\133useFir = true\135.txt"
new file mode 100644
index 0000000..8d77b7a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testDexNaming\133useFir = true\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+val myProperty: () -> Unit @Composable get() {
+    return {  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val myProperty: Function0<Unit>
+  @Composable @JvmName(name = "getMyProperty")
+  get() {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C:Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = {
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp0
+  }
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInlineCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInlineCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..32e6ba3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInlineCall\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable inline fun Example(content: @Composable () -> Unit) {
+    content()
+}
+
+@NonRestartableComposable
+@Composable fun Test() {
+    Example {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Example)<conten...>:Test.kt#2487m")
+  content(%composer, 0b1110 and %changed)
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Example({ %composer: Composer?, %changed: Int ->
+    sourceInformationMarkerStart(%composer, <>, "C:Test.kt#2487m")
+    Unit
+    sourceInformationMarkerEnd(%composer)
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInlineCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInlineCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..32e6ba3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInlineCall\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable inline fun Example(content: @Composable () -> Unit) {
+    content()
+}
+
+@NonRestartableComposable
+@Composable fun Test() {
+    Example {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Example)<conten...>:Test.kt#2487m")
+  content(%composer, 0b1110 and %changed)
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Example({ %composer: Composer?, %changed: Int ->
+    sourceInformationMarkerStart(%composer, <>, "C:Test.kt#2487m")
+    Unit
+    sourceInformationMarkerEnd(%composer)
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInnerClass\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInnerClass\133useFir = false\135.txt"
new file mode 100644
index 0000000..d635b07
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInnerClass\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+interface A {
+    fun b() {}
+}
+class C {
+    val foo = 1
+    inner class D : A {
+        override fun b() {
+            print(foo)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface A {
+  open fun b() { }
+}
+@StabilityInferred(parameters = 0)
+class C {
+  val foo: Int = 1
+  inner class D : A {
+    override fun b() {
+      print(foo)
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInnerClass\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInnerClass\133useFir = true\135.txt"
new file mode 100644
index 0000000..d635b07
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testInnerClass\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+interface A {
+    fun b() {}
+}
+class C {
+    val foo = 1
+    inner class D : A {
+        override fun b() {
+            print(foo)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface A {
+  open fun b() { }
+}
+@StabilityInferred(parameters = 0)
+class C {
+  val foo: Int = 1
+  inner class D : A {
+    override fun b() {
+      print(foo)
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testKeyCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testKeyCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..b5fca55
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testKeyCall\133useFir = false\135.txt"
@@ -0,0 +1,126 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+    import androidx.compose.runtime.key
+
+    @Composable
+    fun Wrapper(block: @Composable () -> Unit) {
+        block()
+    }
+
+    @Composable
+    fun Leaf(text: String) {
+        used(text)
+    }
+
+    @Composable
+    fun Test(value: Int) {
+        key(value) {
+            Wrapper {
+                Leaf("Value $value")
+            }
+        }
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Wrapper(block: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Wrapper)<block(...>:Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(block)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    block(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Wrapper(block, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Leaf(text: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Leaf):Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(text)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Leaf(text, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(value: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    %composer.startMovableGroup(<>, value)
+    sourceInformation(%composer, "<Wrappe...>")
+    Wrapper(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Leaf("...>:Test.kt#2487m")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        Leaf("Value %value", %composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b0110)
+    %composer.endMovableGroup()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testKeyCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testKeyCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..b5fca55
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testKeyCall\133useFir = true\135.txt"
@@ -0,0 +1,126 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+    import androidx.compose.runtime.key
+
+    @Composable
+    fun Wrapper(block: @Composable () -> Unit) {
+        block()
+    }
+
+    @Composable
+    fun Leaf(text: String) {
+        used(text)
+    }
+
+    @Composable
+    fun Test(value: Int) {
+        key(value) {
+            Wrapper {
+                Leaf("Value $value")
+            }
+        }
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Wrapper(block: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Wrapper)<block(...>:Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(block)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    block(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Wrapper(block, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Leaf(text: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Leaf):Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(text)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Leaf(text, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(value: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    %composer.startMovableGroup(<>, value)
+    sourceInformation(%composer, "<Wrappe...>")
+    Wrapper(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Leaf("...>:Test.kt#2487m")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        Leaf("Value %value", %composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b0110)
+    %composer.endMovableGroup()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testLocalClassAndObjectLiterals\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testLocalClassAndObjectLiterals\133useFir = false\135.txt"
new file mode 100644
index 0000000..1dabca6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testLocalClassAndObjectLiterals\133useFir = false\135.txt"
@@ -0,0 +1,96 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Wat() {}
+
+@NonRestartableComposable
+@Composable
+fun Foo(x: Int) {
+    Wat()
+    @NonRestartableComposable
+    @Composable fun goo() { Wat() }
+    class Bar {
+        @NonRestartableComposable
+        @Composable fun baz() { Wat() }
+    }
+    goo()
+    Bar().baz()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Wat(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Wat):Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun Foo(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Foo)<Wat()>,<goo()>,<baz()>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Wat(%composer, 0)
+  @NonRestartableComposable
+  @Composable
+  fun goo(%composer: Composer?, %changed: Int) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(goo)<Wat()>:Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Wat(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+  }
+  class Bar {
+    @NonRestartableComposable
+    @Composable
+    fun baz(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(baz)<Wat()>:Test.kt#2487m")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Wat(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+  }
+  goo(%composer, 0)
+  Bar().baz(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testLocalClassAndObjectLiterals\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testLocalClassAndObjectLiterals\133useFir = true\135.txt"
new file mode 100644
index 0000000..1dabca6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testLocalClassAndObjectLiterals\133useFir = true\135.txt"
@@ -0,0 +1,96 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Wat() {}
+
+@NonRestartableComposable
+@Composable
+fun Foo(x: Int) {
+    Wat()
+    @NonRestartableComposable
+    @Composable fun goo() { Wat() }
+    class Bar {
+        @NonRestartableComposable
+        @Composable fun baz() { Wat() }
+    }
+    goo()
+    Bar().baz()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Wat(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Wat):Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun Foo(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Foo)<Wat()>,<goo()>,<baz()>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Wat(%composer, 0)
+  @NonRestartableComposable
+  @Composable
+  fun goo(%composer: Composer?, %changed: Int) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(goo)<Wat()>:Test.kt#2487m")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Wat(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+  }
+  class Bar {
+    @NonRestartableComposable
+    @Composable
+    fun baz(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(baz)<Wat()>:Test.kt#2487m")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Wat(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+  }
+  goo(%composer, 0)
+  Bar().baz(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testNonComposableCode\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testNonComposableCode\133useFir = false\135.txt"
new file mode 100644
index 0000000..6fc2ecb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testNonComposableCode\133useFir = false\135.txt"
@@ -0,0 +1,73 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+fun A() {}
+val b: Int get() = 123
+fun C(x: Int) {
+    var x = 0
+    x++
+
+    class D {
+        fun E() { A() }
+        val F: Int get() = 123
+    }
+    val g = object { fun H() {} }
+}
+fun I(block: () -> Unit) { block() }
+fun J() {
+    I {
+        I {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() { }
+val b: Int
+  get() {
+    return 123
+  }
+fun C(x: Int) {
+  var x = 0
+  x++
+  class D {
+    fun E() {
+      A()
+    }
+    val F: Int
+      get() {
+        return 123
+      }
+  }
+  val g = <block>{
+    object {
+      fun H() { }
+    }
+  }
+}
+fun I(block: Function0<Unit>) {
+  block()
+}
+fun J() {
+  I {
+    I {
+      A()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testNonComposableCode\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testNonComposableCode\133useFir = true\135.txt"
new file mode 100644
index 0000000..6fc2ecb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testNonComposableCode\133useFir = true\135.txt"
@@ -0,0 +1,73 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+fun A() {}
+val b: Int get() = 123
+fun C(x: Int) {
+    var x = 0
+    x++
+
+    class D {
+        fun E() { A() }
+        val F: Int get() = 123
+    }
+    val g = object { fun H() {} }
+}
+fun I(block: () -> Unit) { block() }
+fun J() {
+    I {
+        I {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() { }
+val b: Int
+  get() {
+    return 123
+  }
+fun C(x: Int) {
+  var x = 0
+  x++
+  class D {
+    fun E() {
+      A()
+    }
+    val F: Int
+      get() {
+        return 123
+      }
+  }
+  val g = <block>{
+    object {
+      fun H() { }
+    }
+  }
+}
+fun I(block: Function0<Unit>) {
+  block()
+}
+fun J() {
+  I {
+    I {
+      A()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableDelegateCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableDelegateCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..cd17285
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableDelegateCall\133useFir = false\135.txt"
@@ -0,0 +1,83 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+import kotlin.reflect.KProperty
+
+class Foo
+
+@Composable
+inline operator fun Foo.getValue(thisObj: Any?, property: KProperty<*>): Foo = this
+
+@Composable
+fun test(foo: Foo) {
+    val delegated by foo
+    used(delegated)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  static val %stable: Int = 0
+}
+@Composable
+fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(getValue)P(1):Test.kt#2487m")
+  val tmp0 = <this>
+  %composer.endReplaceableGroup()
+  return tmp0
+}
+@Composable
+fun test(foo: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test)<delega...>:Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val delegated by {
+      val delegated%delegate = foo
+      @Composable
+      get(%composer: Composer?, %changed: Int) {
+        sourceInformationMarkerStart(%composer, <>, "C<foo>:Test.kt#2487m")
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        val tmp0 = delegated%delegate.getValue(null, ::delegated%delegate, %composer, 0b00110000)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        sourceInformationMarkerEnd(%composer)
+        return tmp0
+      }
+    }
+    used(<get-delegated>(%composer, 0))
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test(foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableDelegateCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableDelegateCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..cd17285
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableDelegateCall\133useFir = true\135.txt"
@@ -0,0 +1,83 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+import kotlin.reflect.KProperty
+
+class Foo
+
+@Composable
+inline operator fun Foo.getValue(thisObj: Any?, property: KProperty<*>): Foo = this
+
+@Composable
+fun test(foo: Foo) {
+    val delegated by foo
+    used(delegated)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  static val %stable: Int = 0
+}
+@Composable
+fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(getValue)P(1):Test.kt#2487m")
+  val tmp0 = <this>
+  %composer.endReplaceableGroup()
+  return tmp0
+}
+@Composable
+fun test(foo: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test)<delega...>:Test.kt#2487m")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val delegated by {
+      val delegated%delegate = foo
+      @Composable
+      get(%composer: Composer?, %changed: Int) {
+        sourceInformationMarkerStart(%composer, <>, "C<foo>:Test.kt#2487m")
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        val tmp0 = delegated%delegate.getValue(null, ::delegated%delegate, %composer, 0b00110000)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        sourceInformationMarkerEnd(%composer)
+        return tmp0
+      }
+    }
+    used(<get-delegated>(%composer, 0))
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test(foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableVarargParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableVarargParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..6d43cd4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableVarargParams\133useFir = false\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun B(vararg values: Int) {
+    print(values)
+}
+
+@NonRestartableComposable
+@Composable
+fun Test() {
+    B(0, 1, 2, 3)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun B(values: IntArray, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt#2487m")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, values.size)
+  val <iterator> = values.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(values)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(*values, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@NonRestartableComposable
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<B(0,>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  B(0, 1, 2, 3, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableVarargParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableVarargParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..6d43cd4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testStableVarargParams\133useFir = true\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun B(vararg values: Int) {
+    print(values)
+}
+
+@NonRestartableComposable
+@Composable
+fun Test() {
+    B(0, 1, 2, 3)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun B(values: IntArray, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt#2487m")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, values.size)
+  val <iterator> = values.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(values)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(*values, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@NonRestartableComposable
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<B(0,>:Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  B(0, 1, 2, 3, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testUnstableDelegateCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testUnstableDelegateCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..4013b66
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testUnstableDelegateCall\133useFir = false\135.txt"
@@ -0,0 +1,82 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+    import kotlin.reflect.KProperty
+
+    class Foo {
+        var unstableField: Int = 0
+    }
+
+    @Composable
+    inline operator fun Foo.getValue(thisObj: Any?, property: KProperty<*>): Foo = this
+
+    @Composable
+    fun test() {
+        val foo by Foo()
+        println(foo)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  var unstableField: Int = 0
+  static val %stable: Int = 8
+}
+@Composable
+fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(getValue)P(1):Test.kt#2487m")
+  val tmp0 = <this>
+  %composer.endReplaceableGroup()
+  return tmp0
+}
+@Composable
+fun test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test)*<foo>:Test.kt#2487m")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo by {
+      val foo%delegate = Foo()
+      @Composable
+      get(%composer: Composer?, %changed: Int) {
+        sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        val tmp0 = foo%delegate.getValue(null, ::foo%delegate, %composer, 0b00111000)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        sourceInformationMarkerEnd(%composer)
+        return tmp0
+      }
+    }
+    println(<get-foo>(%composer, 0))
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testUnstableDelegateCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testUnstableDelegateCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..4013b66
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testUnstableDelegateCall\133useFir = true\135.txt"
@@ -0,0 +1,82 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+    import kotlin.reflect.KProperty
+
+    class Foo {
+        var unstableField: Int = 0
+    }
+
+    @Composable
+    inline operator fun Foo.getValue(thisObj: Any?, property: KProperty<*>): Foo = this
+
+    @Composable
+    fun test() {
+        val foo by Foo()
+        println(foo)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  var unstableField: Int = 0
+  static val %stable: Int = 8
+}
+@Composable
+fun Foo.getValue(thisObj: Any?, property: KProperty<*>, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(getValue)P(1):Test.kt#2487m")
+  val tmp0 = <this>
+  %composer.endReplaceableGroup()
+  return tmp0
+}
+@Composable
+fun test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test)*<foo>:Test.kt#2487m")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo by {
+      val foo%delegate = Foo()
+      @Composable
+      get(%composer: Composer?, %changed: Int) {
+        sourceInformationMarkerStart(%composer, <>, "C<Foo()>:Test.kt#2487m")
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        val tmp0 = foo%delegate.getValue(null, ::foo%delegate, %composer, 0b00111000)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        sourceInformationMarkerEnd(%composer)
+        return tmp0
+      }
+    }
+    println(<get-foo>(%composer, 0))
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testVarargWithNoArgs\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testVarargWithNoArgs\133useFir = false\135.txt"
new file mode 100644
index 0000000..428b269
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testVarargWithNoArgs\133useFir = false\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun VarArgsFirst(vararg foo: Any?) {
+    println(foo)
+}
+
+@Composable
+fun VarArgsCaller() {
+    VarArgsFirst()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun VarArgsFirst(foo: Array<out Any?>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(VarArgsFirst):Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  println(foo)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    VarArgsFirst(*foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun VarArgsCaller(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(VarArgsCaller)<VarArg...>:Test.kt#2487m")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    VarArgsFirst(
+      %composer = %composer,
+      %changed = 8
+    )
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    VarArgsCaller(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testVarargWithNoArgs\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testVarargWithNoArgs\133useFir = true\135.txt"
new file mode 100644
index 0000000..428b269
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/testVarargWithNoArgs\133useFir = true\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+  InternalComposeApi::class,
+)
+package test
+
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.ComposeCompilerApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun VarArgsFirst(vararg foo: Any?) {
+    println(foo)
+}
+
+@Composable
+fun VarArgsCaller() {
+    VarArgsFirst()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun VarArgsFirst(foo: Array<out Any?>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(VarArgsFirst):Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  println(foo)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    VarArgsFirst(*foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun VarArgsCaller(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(VarArgsCaller)<VarArg...>:Test.kt#2487m")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    VarArgsFirst(
+      %composer = %composer,
+      %changed = 8
+    )
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    VarArgsCaller(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInCalleeOverriddenSymbols\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInCalleeOverriddenSymbols\133useFir = false\135.txt"
new file mode 100644
index 0000000..b1c2fbc
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInCalleeOverriddenSymbols\133useFir = false\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+package test
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import dependency.ContentImpl
+
+@Composable
+@NonRestartableComposable
+fun Foo() {
+    ContentImpl().setContent()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Foo(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Foo):Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  ContentImpl().setContent()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInCalleeOverriddenSymbols\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInCalleeOverriddenSymbols\133useFir = true\135.txt"
new file mode 100644
index 0000000..b1c2fbc
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInCalleeOverriddenSymbols\133useFir = true\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+package test
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import dependency.ContentImpl
+
+@Composable
+@NonRestartableComposable
+fun Foo() {
+    ContentImpl().setContent()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Foo(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Foo):Test.kt#2487m")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  ContentImpl().setContent()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInOverriddenSymbols\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInOverriddenSymbols\133useFir = false\135.txt"
new file mode 100644
index 0000000..44c75bd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInOverriddenSymbols\133useFir = false\135.txt"
@@ -0,0 +1,22 @@
+//
+// Source
+// ------------------------------------------
+
+package test
+
+import androidx.compose.runtime.Composable
+import dependency.Content
+
+class ContentImpl : Content {
+    override fun setContent(c: @Composable () -> Unit) {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class ContentImpl : Content {
+  override fun setContent(c: Function2<Composer, Int, Unit>) { }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInOverriddenSymbols\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInOverriddenSymbols\133useFir = true\135.txt"
new file mode 100644
index 0000000..44c75bd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionReferencesInOverriddenSymbols\133useFir = true\135.txt"
@@ -0,0 +1,22 @@
+//
+// Source
+// ------------------------------------------
+
+package test
+
+import androidx.compose.runtime.Composable
+import dependency.Content
+
+class ContentImpl : Content {
+    override fun setContent(c: @Composable () -> Unit) {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class ContentImpl : Content {
+  override fun setContent(c: Function2<Composer, Int, Unit>) { }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionSymbolCalls\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionSymbolCalls\133useFir = false\135.txt"
new file mode 100644
index 0000000..273921d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionSymbolCalls\133useFir = false\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+              InternalComposeApi::class,
+            )
+            package test
+
+            import androidx.compose.runtime.InternalComposeApi
+            import androidx.compose.runtime.ComposeCompilerApi
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+
+            fun abc0(l: @Composable () -> Unit) {
+    val hc = l.hashCode()
+}
+fun abc1(l: @Composable (String) -> Unit) {
+    val hc = l.hashCode()
+}
+fun abc2(l: @Composable (String, Int) -> Unit) {
+    val hc = l.hashCode()
+}
+fun abc3(
+    l: @Composable (Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any) -> Any
+) {
+    val hc = l.hashCode()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun abc0(l: Function2<Composer, Int, Unit>) {
+  val hc = l.hashCode()
+}
+fun abc1(l: Function3<String, Composer, Int, Unit>) {
+  val hc = l.hashCode()
+}
+fun abc2(l: Function4<String, Int, Composer, Int, Unit>) {
+  val hc = l.hashCode()
+}
+fun abc3(l: Function15<Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Composer, Int, Int, Any>) {
+  val hc = l.hashCode()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionSymbolCalls\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionSymbolCalls\133useFir = true\135.txt"
new file mode 100644
index 0000000..273921d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ComposerParamTransformTests/validateNoComposableFunctionSymbolCalls\133useFir = true\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+@file:OptIn(
+              InternalComposeApi::class,
+            )
+            package test
+
+            import androidx.compose.runtime.InternalComposeApi
+            import androidx.compose.runtime.ComposeCompilerApi
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+
+            fun abc0(l: @Composable () -> Unit) {
+    val hc = l.hashCode()
+}
+fun abc1(l: @Composable (String) -> Unit) {
+    val hc = l.hashCode()
+}
+fun abc2(l: @Composable (String, Int) -> Unit) {
+    val hc = l.hashCode()
+}
+fun abc3(
+    l: @Composable (Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any) -> Any
+) {
+    val hc = l.hashCode()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun abc0(l: Function2<Composer, Int, Unit>) {
+  val hc = l.hashCode()
+}
+fun abc1(l: Function3<String, Composer, Int, Unit>) {
+  val hc = l.hashCode()
+}
+fun abc2(l: Function4<String, Int, Composer, Int, Unit>) {
+  val hc = l.hashCode()
+}
+fun abc3(l: Function15<Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Composer, Int, Int, Any>) {
+  val hc = l.hashCode()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndComposableLambdaParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndComposableLambdaParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..1a77532
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndComposableLambdaParam\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+    context(Foo)
+    @Composable
+    fun Test(a: String, b: @Composable (String) -> Unit) {
+        b("yay")
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Test(%context_receiver_0: Foo, a: String, b: Function3<String, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<b("yay...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(b)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001010000001 != 0b10000000 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    b("yay", %composer, 0b0110 or 0b01110000 and %dirty shr 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%context_receiver_0, a, b, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndComposableLambdaParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndComposableLambdaParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..1a77532
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndComposableLambdaParam\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+    context(Foo)
+    @Composable
+    fun Test(a: String, b: @Composable (String) -> Unit) {
+        b("yay")
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Test(%context_receiver_0: Foo, a: String, b: Function3<String, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<b("yay...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(b)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001010000001 != 0b10000000 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    b("yay", %composer, 0b0110 or 0b01110000 and %dirty shr 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%context_receiver_0, a, b, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndDefaultParamsUsage\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndDefaultParamsUsage\133useFir = false\135.txt"
new file mode 100644
index 0000000..c3467e6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndDefaultParamsUsage\133useFir = false\135.txt"
@@ -0,0 +1,98 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+@Composable
+fun Parent() {
+    with(Foo()) {
+        Test()
+        Test(a = "a")
+        Test(b = 101)
+        Test(a = "Yes", b = 10)
+    }
+}
+
+context(Foo)
+@Composable
+fun Test(a: String = "A", b: Int = 2) {
+    val combineParams = a + b
+    if (someString == combineParams) {
+        println("Same same")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Parent(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Parent)*<Test()>,<Test(a>,<Test(b>,<Test(a>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    with(Foo()) {
+      Test(%this%with, null, 0, %composer, 0, 0b0110)
+      Test(%this%with, "a", 0, %composer, 0b00110000, 0b0100)
+      Test(%this%with, null, 101, %composer, 0b000110000000, 0b0010)
+      Test(%this%with, "Yes", 10, %composer, 0b000110110000, 0)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Parent(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(%context_receiver_0: Foo, a: String?, b: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(%context_receiver_0)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (%default and 0b0010 != 0) {
+      a = "A"
+    }
+    if (%default and 0b0100 != 0) {
+      b = 2
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val combineParams = a + b
+    if (%context_receiver_0.someString == combineParams) {
+      println("Same same")
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%context_receiver_0, a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndDefaultParamsUsage\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndDefaultParamsUsage\133useFir = true\135.txt"
new file mode 100644
index 0000000..c3467e6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiverAndDefaultParamsUsage\133useFir = true\135.txt"
@@ -0,0 +1,98 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+@Composable
+fun Parent() {
+    with(Foo()) {
+        Test()
+        Test(a = "a")
+        Test(b = 101)
+        Test(a = "Yes", b = 10)
+    }
+}
+
+context(Foo)
+@Composable
+fun Test(a: String = "A", b: Int = 2) {
+    val combineParams = a + b
+    if (someString == combineParams) {
+        println("Same same")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Parent(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Parent)*<Test()>,<Test(a>,<Test(b>,<Test(a>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    with(Foo()) {
+      Test(%this%with, null, 0, %composer, 0, 0b0110)
+      Test(%this%with, "a", 0, %composer, 0b00110000, 0b0100)
+      Test(%this%with, null, 101, %composer, 0b000110000000, 0b0010)
+      Test(%this%with, "Yes", 10, %composer, 0b000110110000, 0)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Parent(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(%context_receiver_0: Foo, a: String?, b: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(%context_receiver_0)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (%default and 0b0010 != 0) {
+      a = "A"
+    }
+    if (%default and 0b0100 != 0) {
+      b = 2
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val combineParams = a + b
+    if (%context_receiver_0.someString == combineParams) {
+      println("Same same")
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%context_receiver_0, a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndDefaultParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndDefaultParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..c35ca6c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndDefaultParams\133useFir = false\135.txt"
@@ -0,0 +1,100 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo, Bar)
+@Composable
+fun A(a: Int = 1) { }
+
+context(Foo, Bar, FooBar)
+@Composable
+fun B(a: Int, b: String = "", c: Int = 1) { }
+
+context(Foo)
+@Composable
+fun C(a: Int, bar: Bar = Bar()) { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%context_receiver_0: Foo, %context_receiver_1: Bar, a: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (%default and 0b0100 != 0) {
+      a = 1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%context_receiver_0, %context_receiver_1, a, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, a: Int, b: String?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (%default and 0b00010000 != 0) {
+      b = ""
+    }
+    if (%default and 0b00100000 != 0) {
+      c = 1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%context_receiver_0, %context_receiver_1, %context_receiver_2, a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun C(%context_receiver_0: Foo, a: Int, bar: Bar?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(C):Test.kt")
+  val %dirty = %changed
+  if (%dirty and 0b0001 != 0 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0100 != 0) {
+        bar = Bar()
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0100 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    C(%context_receiver_0, a, bar, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndDefaultParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndDefaultParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..c35ca6c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndDefaultParams\133useFir = true\135.txt"
@@ -0,0 +1,100 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo, Bar)
+@Composable
+fun A(a: Int = 1) { }
+
+context(Foo, Bar, FooBar)
+@Composable
+fun B(a: Int, b: String = "", c: Int = 1) { }
+
+context(Foo)
+@Composable
+fun C(a: Int, bar: Bar = Bar()) { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%context_receiver_0: Foo, %context_receiver_1: Bar, a: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (%default and 0b0100 != 0) {
+      a = 1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%context_receiver_0, %context_receiver_1, a, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, a: Int, b: String?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (%default and 0b00010000 != 0) {
+      b = ""
+    }
+    if (%default and 0b00100000 != 0) {
+      c = 1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%context_receiver_0, %context_receiver_1, %context_receiver_2, a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun C(%context_receiver_0: Foo, a: Int, bar: Bar?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(C):Test.kt")
+  val %dirty = %changed
+  if (%dirty and 0b0001 != 0 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0100 != 0) {
+        bar = Bar()
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0100 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    C(%context_receiver_0, a, bar, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiverAndDefaultParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiverAndDefaultParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..8607302
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiverAndDefaultParams\133useFir = false\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo, Bar, FooBar)
+@Composable
+fun String.B(a: Int, b: String = "", c: Int = 1) { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun String.B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, a: Int, b: String?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (%default and 0b00010000 != 0) {
+      b = ""
+    }
+    if (%default and 0b00100000 != 0) {
+      c = 1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%context_receiver_0, %context_receiver_1, %context_receiver_2, a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiverAndDefaultParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiverAndDefaultParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..8607302
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiverAndDefaultParams\133useFir = true\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo, Bar, FooBar)
+@Composable
+fun String.B(a: Int, b: String = "", c: Int = 1) { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun String.B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, a: Int, b: String?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (%default and 0b00010000 != 0) {
+      b = ""
+    }
+    if (%default and 0b00100000 != 0) {
+      c = 1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%context_receiver_0, %context_receiver_1, %context_receiver_2, a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiver\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiver\133useFir = false\135.txt"
new file mode 100644
index 0000000..42b227c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiver\133useFir = false\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo, Bar)
+@Composable
+fun String.A() { }
+
+context(Foo, Bar, FooBar)
+@Composable
+fun String.B() { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun String.A(%context_receiver_0: Foo, %context_receiver_1: Bar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%context_receiver_0, %context_receiver_1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun String.B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%context_receiver_0, %context_receiver_1, %context_receiver_2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiver\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiver\133useFir = true\135.txt"
new file mode 100644
index 0000000..42b227c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversAndExtensionReceiver\133useFir = true\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo, Bar)
+@Composable
+fun String.A() { }
+
+context(Foo, Bar, FooBar)
+@Composable
+fun String.B() { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun String.A(%context_receiver_0: Foo, %context_receiver_1: Bar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%context_receiver_0, %context_receiver_1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun String.B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%context_receiver_0, %context_receiver_1, %context_receiver_2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversNestedWith\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversNestedWith\133useFir = false\135.txt"
new file mode 100644
index 0000000..f8c822e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversNestedWith\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+@Composable
+fun Test(foo: Foo) {
+    with(foo) {
+        A()
+        with(Bar()) {
+            B()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<A()>,<B()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    with(foo) {
+      A(%this%with, %composer, 0)
+      with(Bar()) {
+        B(%this%with, %this%with, %composer, 0)
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversNestedWith\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversNestedWith\133useFir = true\135.txt"
new file mode 100644
index 0000000..f8c822e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversNestedWith\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+@Composable
+fun Test(foo: Foo) {
+    with(foo) {
+        A()
+        with(Bar()) {
+            B()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<A()>,<B()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    with(foo) {
+      A(%this%with, %composer, 0)
+      with(Bar()) {
+        B(%this%with, %this%with, %composer, 0)
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWithAndDefaultParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWithAndDefaultParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..6f29aaf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWithAndDefaultParam\133useFir = false\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+@Composable
+fun Test(foo: Foo) {
+    with(foo) {
+      "Hello".A(2)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<A(2)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    with(foo) {
+      "Hello".A(%this%with, 2, null, %composer, 0b000110000110, 0b0100)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWithAndDefaultParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWithAndDefaultParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..6f29aaf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWithAndDefaultParam\133useFir = true\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+@Composable
+fun Test(foo: Foo) {
+    with(foo) {
+      "Hello".A(2)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<A(2)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    with(foo) {
+      "Hello".A(%this%with, 2, null, %composer, 0b000110000110, 0b0100)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWith\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWith\133useFir = false\135.txt"
new file mode 100644
index 0000000..079c441
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWith\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+
+@Composable
+fun Test(foo: Foo) {
+    with(foo) {
+      A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    with(foo) {
+      A(%this%with, %composer, 0)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWith\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWith\133useFir = true\135.txt"
new file mode 100644
index 0000000..079c441
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testContextReceiversWith\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+
+@Composable
+fun Test(foo: Foo) {
+    with(foo) {
+      A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(foo)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    with(foo) {
+      A(%this%with, %composer, 0)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testLotsOfContextReceivers\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testLotsOfContextReceivers\133useFir = false\135.txt"
new file mode 100644
index 0000000..481615c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testLotsOfContextReceivers\133useFir = false\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(A, B, C, D, E, F, G, H, I, J, K, L)
+@Composable
+fun Test() {
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%context_receiver_0: A, %context_receiver_1: B, %context_receiver_2: C, %context_receiver_3: D, %context_receiver_4: E, %context_receiver_5: F, %context_receiver_6: G, %context_receiver_7: H, %context_receiver_8: I, %context_receiver_9: J, %context_receiver_10: K, %context_receiver_11: L, %composer: Composer?, %changed: Int, %changed1: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed and 0b0001 != 0 || %changed1 and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, %changed1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%context_receiver_0, %context_receiver_1, %context_receiver_2, %context_receiver_3, %context_receiver_4, %context_receiver_5, %context_receiver_6, %context_receiver_7, %context_receiver_8, %context_receiver_9, %context_receiver_10, %context_receiver_11, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testLotsOfContextReceivers\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testLotsOfContextReceivers\133useFir = true\135.txt"
new file mode 100644
index 0000000..481615c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testLotsOfContextReceivers\133useFir = true\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(A, B, C, D, E, F, G, H, I, J, K, L)
+@Composable
+fun Test() {
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%context_receiver_0: A, %context_receiver_1: B, %context_receiver_2: C, %context_receiver_3: D, %context_receiver_4: E, %context_receiver_5: F, %context_receiver_6: G, %context_receiver_7: H, %context_receiver_8: I, %context_receiver_9: J, %context_receiver_10: K, %context_receiver_11: L, %composer: Composer?, %changed: Int, %changed1: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed and 0b0001 != 0 || %changed1 and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, %changed1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%context_receiver_0, %context_receiver_1, %context_receiver_2, %context_receiver_3, %context_receiver_4, %context_receiver_5, %context_receiver_6, %context_receiver_7, %context_receiver_8, %context_receiver_9, %context_receiver_10, %context_receiver_11, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testMultipleContextReceivers\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testMultipleContextReceivers\133useFir = false\135.txt"
new file mode 100644
index 0000000..bccd0e2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testMultipleContextReceivers\133useFir = false\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo, Bar)
+@Composable
+fun A() { }
+
+context(Foo, Bar, FooBar)
+@Composable
+fun B() { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%context_receiver_0: Foo, %context_receiver_1: Bar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%context_receiver_0, %context_receiver_1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%context_receiver_0, %context_receiver_1, %context_receiver_2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testMultipleContextReceivers\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testMultipleContextReceivers\133useFir = true\135.txt"
new file mode 100644
index 0000000..bccd0e2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testMultipleContextReceivers\133useFir = true\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo, Bar)
+@Composable
+fun A() { }
+
+context(Foo, Bar, FooBar)
+@Composable
+fun B() { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%context_receiver_0: Foo, %context_receiver_1: Bar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%context_receiver_0, %context_receiver_1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(%context_receiver_0: Foo, %context_receiver_1: Bar, %context_receiver_2: FooBar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%context_receiver_0, %context_receiver_1, %context_receiver_2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testTrivialContextReceivers\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testTrivialContextReceivers\133useFir = false\135.txt"
new file mode 100644
index 0000000..b47d948
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testTrivialContextReceivers\133useFir = false\135.txt"
@@ -0,0 +1,33 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo)
+@Composable
+fun Test() { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%context_receiver_0: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%context_receiver_0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testTrivialContextReceivers\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testTrivialContextReceivers\133useFir = true\135.txt"
new file mode 100644
index 0000000..b47d948
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ContextReceiversTransformTests/testTrivialContextReceivers\133useFir = true\135.txt"
@@ -0,0 +1,33 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+context(Foo)
+@Composable
+fun Test() { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%context_receiver_0: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%context_receiver_0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = false\135.txt"
new file mode 100644
index 0000000..b2ca142
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = false\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Example() {
+    B() && B()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<B()>,<B()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0_group = B(%composer, 0) && B(%composer, 0)
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = true\135.txt"
new file mode 100644
index 0000000..b2ca142
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testAND\133useFir = true\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Example() {
+    B() && B()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<B()>,<B()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0_group = B(%composer, 0) && B(%composer, 0)
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testApplyOnComposableCallResult\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testApplyOnComposableCallResult\133useFir = false\135.txt"
new file mode 100644
index 0000000..d85e10f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testApplyOnComposableCallResult\133useFir = false\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.State
+
+@Composable
+fun <T> provided(value: T): State<T> = remember { mutableStateOf(value) }.apply {
+    this.value = value
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun <T> provided(value: T, %composer: Composer?, %changed: Int): State<T> {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(provided)*<rememb...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = remember({
+    mutableStateOf(
+      value = value
+    )
+  }, %composer, 0).apply {
+    %this%apply.value = value
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testApplyOnComposableCallResult\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testApplyOnComposableCallResult\133useFir = true\135.txt"
new file mode 100644
index 0000000..d85e10f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testApplyOnComposableCallResult\133useFir = true\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.State
+
+@Composable
+fun <T> provided(value: T): State<T> = remember { mutableStateOf(value) }.apply {
+    this.value = value
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun <T> provided(value: T, %composer: Composer?, %changed: Int): State<T> {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(provided)*<rememb...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = remember({
+    mutableStateOf(
+      value = value
+    )
+  }, %composer, 0).apply {
+    %this%apply.value = value
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..c9497b4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        if (i == 0) {
+            break
+        }
+        P(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    if (i == 0) {
+      break
+    }
+    P(i, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..c9497b4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        if (i == 0) {
+            break
+        }
+        P(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    if (i == 0) {
+      break
+    }
+    P(i, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfterAndCallAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfterAndCallAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..1df8e47
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfterAndCallAfter\133useFir = false\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    // a group around while is needed here
+    while (items.hasNext()) {
+        val i = items.next()
+        P(i)
+        if (i == 0) {
+            break
+        }
+        P(i)
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<P(i)>,<P(i)>")
+  while (items.hasNext()) {
+    val i = items.next()
+    P(i, %composer, 0)
+    if (i == 0) {
+      break
+    }
+    P(i, %composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfterAndCallAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfterAndCallAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..1df8e47
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfterAndCallAfter\133useFir = true\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    // a group around while is needed here
+    while (items.hasNext()) {
+        val i = items.next()
+        P(i)
+        if (i == 0) {
+            break
+        }
+        P(i)
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<P(i)>,<P(i)>")
+  while (items.hasNext()) {
+    val i = items.next()
+    P(i, %composer, 0)
+    if (i == 0) {
+      break
+    }
+    P(i, %composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..c548530
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfter\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    // a group around while is needed here, but the function body group will suffice
+    while (items.hasNext()) {
+        val i = items.next()
+        val j = i
+        P(i)
+        if (i == 0) {
+            break
+        }
+        P(j)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>,<P(j)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    val j = i
+    P(i, %composer, 0)
+    if (i == 0) {
+      break
+    }
+    P(j, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..c548530
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBeforeAndAfter\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    // a group around while is needed here, but the function body group will suffice
+    while (items.hasNext()) {
+        val i = items.next()
+        val j = i
+        P(i)
+        if (i == 0) {
+            break
+        }
+        P(j)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>,<P(j)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    val j = i
+    P(i, %composer, 0)
+    if (i == 0) {
+      break
+    }
+    P(j, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBefore\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBefore\133useFir = false\135.txt"
new file mode 100644
index 0000000..8044240
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBefore\133useFir = false\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        P(i)
+        if (i == 0) {
+            break
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    P(i, %composer, 0)
+    if (i == 0) {
+      break
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBefore\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBefore\133useFir = true\135.txt"
new file mode 100644
index 0000000..8044240
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testBreakWithCallsBefore\133useFir = true\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        P(i)
+        if (i == 0) {
+            break
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    P(i, %composer, 0)
+    if (i == 0) {
+      break
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAWrapperComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAWrapperComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..436dd3e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAWrapperComposable\133useFir = false\135.txt"
@@ -0,0 +1,56 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  W {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<W>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A()>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      A(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAWrapperComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAWrapperComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..436dd3e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAWrapperComposable\133useFir = true\135.txt"
@@ -0,0 +1,56 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  W {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<W>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A()>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      A(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAnInlineWrapperComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAnInlineWrapperComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..c4462e9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAnInlineWrapperComposable\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  IW {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<IW>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    IW({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<A()>:Test.kt")
+      A(%composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAnInlineWrapperComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAnInlineWrapperComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..c4462e9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testCallingAnInlineWrapperComposable\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  IW {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<IW>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    IW({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<A()>:Test.kt")
+      A(%composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposableWithInlineClass\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposableWithInlineClass\133useFir = false\135.txt"
new file mode 100644
index 0000000..1369b3a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposableWithInlineClass\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test(value: InlineClass) {
+    used(value)
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(value: InlineClass, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(0:InlineClass)<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(value))) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(value)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposableWithInlineClass\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposableWithInlineClass\133useFir = true\135.txt"
new file mode 100644
index 0000000..1369b3a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposableWithInlineClass\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test(value: InlineClass) {
+    used(value)
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(value: InlineClass, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(0:InlineClass)<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(value))) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(value)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt"
new file mode 100644
index 0000000..0b354f4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt"
@@ -0,0 +1,77 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.runtime.*
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.material.*
+
+object Ui {}
+
+@Composable
+fun Ui.UiTextField(
+    isError: Boolean = false,
+    keyboardActions2: Boolean = false,
+) {
+    println("t41 insideFunction $isError")
+    println("t41 insideFunction $keyboardActions2")
+    Column {
+        Text("$isError")
+        Text("$keyboardActions2")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object Ui {
+  static val %stable: Int = 0
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(UiTextField)<Column>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(isError)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      isError = false
+    }
+    if (%default and 0b0010 != 0) {
+      keyboardActions2 = false
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    println("t41 insideFunction %isError")
+    println("t41 insideFunction %keyboardActions2")
+    Column(null, null, null, { %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text("...>,<Text("...>:Test.kt")
+      Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+      Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0, 0b0111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt"
new file mode 100644
index 0000000..0b354f4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt"
@@ -0,0 +1,77 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.runtime.*
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.material.*
+
+object Ui {}
+
+@Composable
+fun Ui.UiTextField(
+    isError: Boolean = false,
+    keyboardActions2: Boolean = false,
+) {
+    println("t41 insideFunction $isError")
+    println("t41 insideFunction $keyboardActions2")
+    Column {
+        Text("$isError")
+        Text("$keyboardActions2")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object Ui {
+  static val %stable: Int = 0
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(UiTextField)<Column>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(isError)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      isError = false
+    }
+    if (%default and 0b0010 != 0) {
+      keyboardActions2 = false
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    println("t41 insideFunction %isError")
+    println("t41 insideFunction %keyboardActions2")
+    Column(null, null, null, { %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text("...>,<Text("...>:Test.kt")
+      Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+      Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0, 0b0111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..260958f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        if (i == 0) {
+            continue
+        }
+        P(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<P(i)>")
+    val i = items.next()
+    if (i == 0) {
+      %composer.endReplaceableGroup()
+      continue
+    }
+    P(i, %composer, 0)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..260958f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        if (i == 0) {
+            continue
+        }
+        P(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<P(i)>")
+    val i = items.next()
+    if (i == 0) {
+      %composer.endReplaceableGroup()
+      continue
+    }
+    P(i, %composer, 0)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBeforeAndAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBeforeAndAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..5cd2f4c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBeforeAndAfter\133useFir = false\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        P(i)
+        if (i == 0) {
+            continue
+        }
+        P(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<P(i)>,<P(i)>")
+    val i = items.next()
+    P(i, %composer, 0)
+    if (i == 0) {
+      %composer.endReplaceableGroup()
+      continue
+    }
+    P(i, %composer, 0)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBeforeAndAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBeforeAndAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..5cd2f4c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBeforeAndAfter\133useFir = true\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        P(i)
+        if (i == 0) {
+            continue
+        }
+        P(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<P(i)>,<P(i)>")
+    val i = items.next()
+    P(i, %composer, 0)
+    if (i == 0) {
+      %composer.endReplaceableGroup()
+      continue
+    }
+    P(i, %composer, 0)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBefore\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBefore\133useFir = false\135.txt"
new file mode 100644
index 0000000..0942632
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBefore\133useFir = false\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        P(i)
+        if (i == 0) {
+            continue
+        }
+        print(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<P(i)>")
+    val i = items.next()
+    P(i, %composer, 0)
+    if (i == 0) {
+      %composer.endReplaceableGroup()
+      continue
+    }
+    print(i)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBefore\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBefore\133useFir = true\135.txt"
new file mode 100644
index 0000000..0942632
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testContinueWithCallsBefore\133useFir = true\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        P(i)
+        if (i == 0) {
+            continue
+        }
+        print(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<P(i)>")
+    val i = items.next()
+    P(i, %composer, 0)
+    if (i == 0) {
+      %composer.endReplaceableGroup()
+      continue
+    }
+    print(i)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..dc4f462
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int): Int {
+    return if (x > 0) {
+        if (B()) 1
+        else if (B()) 2
+        else 3
+    } else 4
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = <block>{
+    val tmp4_group = if (x > 0) {
+      val tmp3_group = if (%composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<B()>")
+      val tmp1_group = B(%composer, 0)
+      %composer.endReplaceableGroup()
+      tmp1_group) 1 else if (%composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<B()>")
+      val tmp2_group = B(%composer, 0)
+      %composer.endReplaceableGroup()
+      tmp2_group) 2 else 3
+      tmp3_group
+    } else {
+      4
+    }
+    tmp4_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..dc4f462
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testDynamicWrappingGroupWithReturnValue\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int): Int {
+    return if (x > 0) {
+        if (B()) 1
+        else if (B()) 2
+        else 3
+    } else 4
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = <block>{
+    val tmp4_group = if (x > 0) {
+      val tmp3_group = if (%composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<B()>")
+      val tmp1_group = B(%composer, 0)
+      %composer.endReplaceableGroup()
+      tmp1_group) 1 else if (%composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<B()>")
+      val tmp2_group = B(%composer, 0)
+      %composer.endReplaceableGroup()
+      tmp2_group) 2 else 3
+      tmp3_group
+    } else {
+      4
+    }
+    tmp4_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnCallValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnCallValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..a8106b9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnCallValue\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int): Int {
+    if (x > 0) {
+        return R()
+    }
+    return R()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<R()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "<R()>")
+  if (x > 0) {
+    val tmp1_return = R(%composer, 0)
+    %composer.endReplaceableGroup()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp1_return
+  }
+  %composer.endReplaceableGroup()
+  val tmp0 = R(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnCallValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnCallValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..a8106b9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnCallValue\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int): Int {
+    if (x > 0) {
+        return R()
+    }
+    return R()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<R()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "<R()>")
+  if (x > 0) {
+    val tmp1_return = R(%composer, 0)
+    %composer.endReplaceableGroup()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp1_return
+  }
+  %composer.endReplaceableGroup()
+  val tmp0 = R(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromCrossInlinedLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromCrossInlinedLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..4c4ea1d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromCrossInlinedLambda\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?) {
+    Dialog {
+        if (false) Test(param)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Dialog>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(param)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Dialog({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<Test(p...>")
+      if (false) {
+        Test(param, %composer, 0b1110 and %dirty)
+      }
+      %composer.endReplaceableGroup()
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromCrossInlinedLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromCrossInlinedLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..4c4ea1d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromCrossInlinedLambda\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?) {
+    Dialog {
+        if (false) Test(param)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Dialog>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(param)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Dialog({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<Test(p...>")
+      if (false) {
+        Test(param, %composer, 0b1110 and %dirty)
+      }
+      %composer.endReplaceableGroup()
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromWhenStatement\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromWhenStatement\133useFir = false\135.txt"
new file mode 100644
index 0000000..efbf242
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromWhenStatement\133useFir = false\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?) {
+    val state = remember { mutableStateOf(false) }
+    when (state.value) {
+        true -> return Text(text = "true")
+        else -> Text(text = "false")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val state = remember({
+      mutableStateOf(
+        value = false
+      )
+    }, %composer, 0)
+    val tmp0_subject = state.value
+    when {
+      tmp0_subject == true -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<Text(t...>")
+        val tmp0_return = Text("true", %composer, 0b0110)
+        %composer.endReplaceableGroup()
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return tmp0_return
+      }
+      else -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<Text(t...>")
+        Text("false", %composer, 0b0110)
+        %composer.endReplaceableGroup()
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromWhenStatement\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromWhenStatement\133useFir = true\135.txt"
new file mode 100644
index 0000000..efbf242
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnFromWhenStatement\133useFir = true\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?) {
+    val state = remember { mutableStateOf(false) }
+    when (state.value) {
+        true -> return Text(text = "true")
+        else -> Text(text = "false")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val state = remember({
+      mutableStateOf(
+        value = false
+      )
+    }, %composer, 0)
+    val tmp0_subject = state.value
+    when {
+      tmp0_subject == true -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<Text(t...>")
+        val tmp0_return = Text("true", %composer, 0b0110)
+        %composer.endReplaceableGroup()
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return tmp0_return
+      }
+      else -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<Text(t...>")
+        Text("false", %composer, 0b0110)
+        %composer.endReplaceableGroup()
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValueWithCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValueWithCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..6d045c2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValueWithCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int): Int {
+    if (x > 0) {
+        return 1
+    }
+    A()
+    return 2
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    val tmp1_return = 1
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp1_return
+  }
+  A(%composer, 0)
+  val tmp0 = 2
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValueWithCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValueWithCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..6d045c2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValueWithCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int): Int {
+    if (x > 0) {
+        return 1
+    }
+    A()
+    return 2
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    val tmp1_return = 1
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp1_return
+  }
+  A(%composer, 0)
+  val tmp0 = 2
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..904ae2a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValue\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int): Int {
+    if (x > 0) {
+        A()
+        return 1
+    }
+    return 2
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(%composer, 0)
+    val tmp1_return = 1
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp1_return
+  }
+  val tmp0 = 2
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..904ae2a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnValue\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int): Int {
+    if (x > 0) {
+        A()
+        return 1
+    }
+    return 2
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(%composer, 0)
+    val tmp1_return = 1
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return tmp1_return
+  }
+  val tmp0 = 2
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsAfterButNotBefore\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsAfterButNotBefore\133useFir = false\135.txt"
new file mode 100644
index 0000000..66cec40
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsAfterButNotBefore\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // we can just close out the open groups at the return.
+    if (x > 0) {
+        return
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return
+  }
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsAfterButNotBefore\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsAfterButNotBefore\133useFir = true\135.txt"
new file mode 100644
index 0000000..66cec40
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsAfterButNotBefore\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // we can just close out the open groups at the return.
+    if (x > 0) {
+        return
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return
+  }
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsBeforeButNotAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsBeforeButNotAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..e698b4b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsBeforeButNotAfter\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // in the early return path, we need only close out the opened groups
+    if (x > 0) {
+        A()
+        return
+    }
+    print("hello")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return
+  }
+  print("hello")
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsBeforeButNotAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsBeforeButNotAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..e698b4b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEarlyReturnWithCallsBeforeButNotAfter\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // in the early return path, we need only close out the opened groups
+    if (x > 0) {
+        A()
+        return
+    }
+    print("hello")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return
+  }
+  print("hello")
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testElvis\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testElvis\133useFir = false\135.txt"
new file mode 100644
index 0000000..0910c29e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testElvis\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int?) {
+    // The composable call is made conditionally, which means it is like an if, but with
+    // only one result having a composable call, so we just generate a single group
+    // around the whole expression.
+    val y = x ?: R()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int?, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<R()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val y = <block>{
+    val <elvis> = x
+    val tmp0_group = when {
+      <elvis> == null -> {
+        R(%composer, 0)
+      }
+      else -> {
+        <elvis>
+      }
+    }
+    tmp0_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testElvis\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testElvis\133useFir = true\135.txt"
new file mode 100644
index 0000000..0910c29e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testElvis\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int?) {
+    // The composable call is made conditionally, which means it is like an if, but with
+    // only one result having a composable call, so we just generate a single group
+    // around the whole expression.
+    val y = x ?: R()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int?, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<R()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val y = <block>{
+    val <elvis> = x
+    val tmp0_group = when {
+      <elvis> == null -> {
+        R(%composer, 0)
+      }
+      else -> {
+        <elvis>
+      }
+    }
+    tmp0_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInInline_Labeled\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInInline_Labeled\133useFir = false\135.txt"
new file mode 100644
index 0000000..5deb31b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInInline_Labeled\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test(condition: Boolean) {
+    IW iw@ {
+        if (condition) return@iw
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<IW>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    IW({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>:Test.kt")
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@IW
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInInline_Labeled\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInInline_Labeled\133useFir = true\135.txt"
new file mode 100644
index 0000000..5deb31b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInInline_Labeled\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test(condition: Boolean) {
+    IW iw@ {
+        if (condition) return@iw
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<IW>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    IW({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>:Test.kt")
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@IW
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_NormalComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_NormalComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..6e92214
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_NormalComposable\133useFir = false\135.txt"
@@ -0,0 +1,75 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+object obj {
+    val condition = true
+}
+
+@Composable
+fun Test(condition: Boolean) {
+    if (condition) return
+    with (obj) {
+        if (condition) return
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object obj {
+  val condition: Boolean = true
+  static val %stable: Int = 0
+}
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (condition) {
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+        Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+      }
+      return
+    }
+    with(obj) {
+      if (condition) {
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+    }
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_NormalComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_NormalComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..6e92214
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_NormalComposable\133useFir = true\135.txt"
@@ -0,0 +1,75 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+object obj {
+    val condition = true
+}
+
+@Composable
+fun Test(condition: Boolean) {
+    if (condition) return
+    with (obj) {
+        if (condition) return
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object obj {
+  val condition: Boolean = true
+  static val %stable: Int = 0
+}
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (condition) {
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+        Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+      }
+      return
+    }
+    with(obj) {
+      if (condition) {
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+    }
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_ReadOnlyComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_ReadOnlyComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..7751da1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_ReadOnlyComposable\133useFir = false\135.txt"
@@ -0,0 +1,72 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+import androidx.compose.runtime.currentComposer
+
+object obj {
+    val condition = false
+}
+
+@Composable
+@ReadOnlyComposable
+fun Calculate(condition: Boolean): Boolean {
+    if (condition) return false
+
+    with (obj) {
+        if (condition) return false
+        return currentComposer.inserting
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object obj {
+  val condition: Boolean = false
+  static val %stable: Int = 0
+}
+@Composable
+@ReadOnlyComposable
+fun Calculate(condition: Boolean, %composer: Composer?, %changed: Int): Boolean {
+  sourceInformationMarkerStart(%composer, <>, "C(Calculate):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (condition) {
+    val tmp0_return = false
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp0_return
+  }
+  with(obj) {
+    if (condition) {
+      val tmp0_return = false
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      sourceInformationMarkerEnd(%composer)
+      return tmp0_return
+    }
+    val tmp1_return = %composer.inserting
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp1_return
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_ReadOnlyComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_ReadOnlyComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..7751da1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureEarlyExitInNonInline_ReadOnlyComposable\133useFir = true\135.txt"
@@ -0,0 +1,72 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+import androidx.compose.runtime.currentComposer
+
+object obj {
+    val condition = false
+}
+
+@Composable
+@ReadOnlyComposable
+fun Calculate(condition: Boolean): Boolean {
+    if (condition) return false
+
+    with (obj) {
+        if (condition) return false
+        return currentComposer.inserting
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object obj {
+  val condition: Boolean = false
+  static val %stable: Int = 0
+}
+@Composable
+@ReadOnlyComposable
+fun Calculate(condition: Boolean, %composer: Composer?, %changed: Int): Boolean {
+  sourceInformationMarkerStart(%composer, <>, "C(Calculate):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (condition) {
+    val tmp0_return = false
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp0_return
+  }
+  with(obj) {
+    if (condition) {
+      val tmp0_return = false
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      sourceInformationMarkerEnd(%composer)
+      return tmp0_return
+    }
+    val tmp1_return = %composer.inserting
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp1_return
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureRuntimeTestWillCompile_CG\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureRuntimeTestWillCompile_CG\133useFir = false\135.txt"
new file mode 100644
index 0000000..20013e7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureRuntimeTestWillCompile_CG\133useFir = false\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun test_CM1_RetFun(condition: Boolean) {
+    Text("Root - before")
+    M1 {
+        Text("M1 - before")
+        if (condition) return
+        Text("M1 - after")
+    }
+    Text("Root - after")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun test_CM1_RetFun(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test_CM1_RetFun)<Text("...>,<M1>,<Text("...>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Root - before", %composer, 0b0110)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
+      Text("M1 - before", %composer, 0b0110)
+      if (condition) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer@test_CM1_RetFun.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          test_CM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      Text("M1 - after", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("Root - after", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test_CM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureRuntimeTestWillCompile_CG\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureRuntimeTestWillCompile_CG\133useFir = true\135.txt"
new file mode 100644
index 0000000..20013e7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testEnsureRuntimeTestWillCompile_CG\133useFir = true\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun test_CM1_RetFun(condition: Boolean) {
+    Text("Root - before")
+    M1 {
+        Text("M1 - before")
+        if (condition) return
+        Text("M1 - after")
+    }
+    Text("Root - after")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun test_CM1_RetFun(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test_CM1_RetFun)<Text("...>,<M1>,<Text("...>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Root - before", %composer, 0b0110)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
+      Text("M1 - before", %composer, 0b0110)
+      if (condition) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer@test_CM1_RetFun.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          test_CM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      Text("M1 - after", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("Root - after", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test_CM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBodyAndCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBodyAndCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..799230f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBodyAndCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: List<Int>) {
+    // The composable call is made a conditional number of times, so we need to wrap
+    // the loop with a dynamic wrapping group.
+    for (i in items) {
+        P(i)
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<P(i)>")
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val i = <iterator>.next()
+    P(i, %composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBodyAndCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBodyAndCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..799230f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBodyAndCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: List<Int>) {
+    // The composable call is made a conditional number of times, so we need to wrap
+    // the loop with a dynamic wrapping group.
+    for (i in items) {
+        P(i)
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<P(i)>")
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val i = <iterator>.next()
+    P(i, %composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBody\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBody\133useFir = false\135.txt"
new file mode 100644
index 0000000..73b254f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBody\133useFir = false\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: List<Int>) {
+    // The composable call is made a conditional number of times, so we need to wrap
+    // the loop with a dynamic wrapping group. Since there are no other calls, the
+    // function body group will suffice.
+    for (i in items) {
+        P(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val i = <iterator>.next()
+    P(i, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBody\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBody\133useFir = true\135.txt"
new file mode 100644
index 0000000..73b254f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInBody\133useFir = true\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: List<Int>) {
+    // The composable call is made a conditional number of times, so we need to wrap
+    // the loop with a dynamic wrapping group. Since there are no other calls, the
+    // function body group will suffice.
+    for (i in items) {
+        P(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val i = <iterator>.next()
+    P(i, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInSubject\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInSubject\133useFir = false\135.txt"
new file mode 100644
index 0000000..4d2696b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInSubject\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // The for loop's subject expression is only executed once, so we don't need any
+    // additional groups
+    for (i in L()) {
+        print(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<L()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val <iterator> = L(%composer, 0).iterator()
+  while (<iterator>.hasNext()) {
+    val i = <iterator>.next()
+    print(i)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInSubject\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInSubject\133useFir = true\135.txt"
new file mode 100644
index 0000000..4d2696b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testForLoopWithCallsInSubject\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // The for loop's subject expression is only executed once, so we don't need any
+    // additional groups
+    for (i in L()) {
+        print(i)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<L()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val <iterator> = L(%composer, 0).iterator()
+  while (<iterator>.hasNext()) {
+    val i = <iterator>.next()
+    print(i)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testGroupAroundExtensionFunctions\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testGroupAroundExtensionFunctions\133useFir = false\135.txt"
new file mode 100644
index 0000000..2bfcc74
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testGroupAroundExtensionFunctions\133useFir = false\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(start: Int, end: Int) {
+    val a = remember { A() }
+    for (i in start until end) {
+        val b = a.get(bKey)
+        if (i == 2) {
+            a.get(cKey)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(start: Int, end: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(1)<rememb...>,*<get(bK...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(start)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(end)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val a = remember({
+      A()
+    }, %composer, 0)
+    val <iterator> = start until end.iterator()
+    while (<iterator>.hasNext()) {
+      val i = <iterator>.next()
+      val b = a.get(bKey, %composer, 0b00110110)
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<get(cK...>")
+      if (i == 0b0010) {
+        a.get(cKey, %composer, 0b00110110)
+      }
+      %composer.endReplaceableGroup()
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(start, end, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testGroupAroundExtensionFunctions\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testGroupAroundExtensionFunctions\133useFir = true\135.txt"
new file mode 100644
index 0000000..2bfcc74
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testGroupAroundExtensionFunctions\133useFir = true\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(start: Int, end: Int) {
+    val a = remember { A() }
+    for (i in start until end) {
+        val b = a.get(bKey)
+        if (i == 2) {
+            a.get(cKey)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(start: Int, end: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(1)<rememb...>,*<get(bK...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(start)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(end)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val a = remember({
+      A()
+    }, %composer, 0)
+    val <iterator> = start until end.iterator()
+    while (<iterator>.hasNext()) {
+      val i = <iterator>.next()
+      val b = a.get(bKey, %composer, 0b00110110)
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<get(cK...>")
+      if (i == 0b0010) {
+        a.get(cKey, %composer, 0b00110110)
+      }
+      %composer.endReplaceableGroup()
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(start, end, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInBranch\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInBranch\133useFir = false\135.txt"
new file mode 100644
index 0000000..2b2e8e1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInBranch\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // Composable calls in the result blocks, so we can determine static number of
+    // groups executed. This means we put a group around the "then" and the
+    // "else" blocks
+    if (x > 0) {
+        A(a)
+    } else {
+        A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<A(a)>")
+    A(a, %composer, 0)
+    %composer.endReplaceableGroup()
+  } else {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInBranch\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInBranch\133useFir = true\135.txt"
new file mode 100644
index 0000000..2b2e8e1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInBranch\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // Composable calls in the result blocks, so we can determine static number of
+    // groups executed. This means we put a group around the "then" and the
+    // "else" blocks
+    if (x > 0) {
+        A(a)
+    } else {
+        A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<A(a)>")
+    A(a, %composer, 0)
+    %composer.endReplaceableGroup()
+  } else {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = false\135.txt"
new file mode 100644
index 0000000..6d1bf67
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = false\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // Since the condition in the else-if is conditionally executed, it means we have
+    // dynamic execution and we can't statically guarantee the number of groups. As a
+    // result, we generate a group around the if statement in addition to a group around
+    // each of the conditions with composable calls in them. Note that no group is
+    // needed around the else condition
+    if (B(a)) {
+        NA()
+    } else if (B(b)) {
+        NA()
+    } else {
+        NA()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (%composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "<B(a)>")
+  val tmp0_group = B(a, %composer, 0)
+  %composer.endReplaceableGroup()
+  tmp0_group) {
+    NA()
+  } else if (%composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "<B(b)>")
+  val tmp1_group = B(b, %composer, 0)
+  %composer.endReplaceableGroup()
+  tmp1_group) {
+    NA()
+  } else {
+    NA()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = true\135.txt"
new file mode 100644
index 0000000..6d1bf67
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfElseWithCallsInConditions\133useFir = true\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // Since the condition in the else-if is conditionally executed, it means we have
+    // dynamic execution and we can't statically guarantee the number of groups. As a
+    // result, we generate a group around the if statement in addition to a group around
+    // each of the conditions with composable calls in them. Note that no group is
+    // needed around the else condition
+    if (B(a)) {
+        NA()
+    } else if (B(b)) {
+        NA()
+    } else {
+        NA()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (%composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "<B(a)>")
+  val tmp0_group = B(a, %composer, 0)
+  %composer.endReplaceableGroup()
+  tmp0_group) {
+    NA()
+  } else if (%composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "<B(b)>")
+  val tmp1_group = B(b, %composer, 0)
+  %composer.endReplaceableGroup()
+  tmp1_group) {
+    NA()
+  } else {
+    NA()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfNonComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfNonComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..714206d1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfNonComposable\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // No composable calls, so no group generated except for at function boundary
+    if (x > 0) {
+        NA()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    NA()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfNonComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfNonComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..714206d1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfNonComposable\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // No composable calls, so no group generated except for at function boundary
+    if (x > 0) {
+        NA()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    NA()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = false\135.txt"
new file mode 100644
index 0000000..348c308
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // Since the first condition of an if/else is unconditionally executed, it does not
+    // necessitate a group of any kind, so we just end up with the function boundary
+    // group
+    if (B()) {
+        NA()
+    } else {
+        NA()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<B()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (B(%composer, 0)) {
+    NA()
+  } else {
+    NA()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = true\135.txt"
new file mode 100644
index 0000000..348c308
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallInCondition\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // Since the first condition of an if/else is unconditionally executed, it does not
+    // necessitate a group of any kind, so we just end up with the function boundary
+    // group
+    if (B()) {
+        NA()
+    } else {
+        NA()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<B()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (B(%composer, 0)) {
+    NA()
+  } else {
+    NA()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallsInBranch\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallsInBranch\133useFir = false\135.txt"
new file mode 100644
index 0000000..e1fc89d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallsInBranch\133useFir = false\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // Only one composable call in the result blocks, so we can just generate
+    // a single group around the whole expression.
+    if (x > 0) {
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallsInBranch\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallsInBranch\133useFir = true\135.txt"
new file mode 100644
index 0000000..e1fc89d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testIfWithCallsInBranch\133useFir = true\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // Only one composable call in the result blocks, so we can just generate
+    // a single group around the whole expression.
+    if (x > 0) {
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineArrayConstructor\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineArrayConstructor\133useFir = false\135.txt"
new file mode 100644
index 0000000..6912586
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineArrayConstructor\133useFir = false\135.txt"
@@ -0,0 +1,99 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun ArrayConstructorTest(n: Int) {
+    Array(n) { remember { it } }
+    ByteArray(n) { remember { it.toByte() } }
+    CharArray(n) { remember { it.toChar() } }
+    ShortArray(n) { remember { it.toShort() } }
+    IntArray(n) { remember { it } }
+    LongArray(n) { remember { it.toLong() } }
+    FloatArray(n) { remember { it.toFloat() } }
+    DoubleArray(n) { remember { it.toDouble() } }
+    BooleanArray(n) { remember { false } }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun ArrayConstructorTest(n: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(ArrayConstructorTest)<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(n)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Array(n) { it: Int ->
+      val tmp0_return = remember({
+        it
+      }, %composer, 0)
+      tmp0_return
+    }
+    ByteArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toByte()
+      }, %composer, 0)
+      tmp0_return
+    }
+    CharArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toChar()
+      }, %composer, 0)
+      tmp0_return
+    }
+    ShortArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toShort()
+      }, %composer, 0)
+      tmp0_return
+    }
+    IntArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it
+      }, %composer, 0)
+      tmp0_return
+    }
+    LongArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toLong()
+      }, %composer, 0)
+      tmp0_return
+    }
+    FloatArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toFloat()
+      }, %composer, 0)
+      tmp0_return
+    }
+    DoubleArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toDouble()
+      }, %composer, 0)
+      tmp0_return
+    }
+    BooleanArray(n) { it: Int ->
+      val tmp0_return = remember({
+        false
+      }, %composer, 0)
+      tmp0_return
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    ArrayConstructorTest(n, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineArrayConstructor\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineArrayConstructor\133useFir = true\135.txt"
new file mode 100644
index 0000000..6912586
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineArrayConstructor\133useFir = true\135.txt"
@@ -0,0 +1,99 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun ArrayConstructorTest(n: Int) {
+    Array(n) { remember { it } }
+    ByteArray(n) { remember { it.toByte() } }
+    CharArray(n) { remember { it.toChar() } }
+    ShortArray(n) { remember { it.toShort() } }
+    IntArray(n) { remember { it } }
+    LongArray(n) { remember { it.toLong() } }
+    FloatArray(n) { remember { it.toFloat() } }
+    DoubleArray(n) { remember { it.toDouble() } }
+    BooleanArray(n) { remember { false } }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun ArrayConstructorTest(n: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(ArrayConstructorTest)<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>,<rememb...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(n)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Array(n) { it: Int ->
+      val tmp0_return = remember({
+        it
+      }, %composer, 0)
+      tmp0_return
+    }
+    ByteArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toByte()
+      }, %composer, 0)
+      tmp0_return
+    }
+    CharArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toChar()
+      }, %composer, 0)
+      tmp0_return
+    }
+    ShortArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toShort()
+      }, %composer, 0)
+      tmp0_return
+    }
+    IntArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it
+      }, %composer, 0)
+      tmp0_return
+    }
+    LongArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toLong()
+      }, %composer, 0)
+      tmp0_return
+    }
+    FloatArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toFloat()
+      }, %composer, 0)
+      tmp0_return
+    }
+    DoubleArray(n) { it: Int ->
+      val tmp0_return = remember({
+        it.toDouble()
+      }, %composer, 0)
+      tmp0_return
+    }
+    BooleanArray(n) { it: Int ->
+      val tmp0_return = remember({
+        false
+      }, %composer, 0)
+      tmp0_return
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    ArrayConstructorTest(n, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambdaBeforeACall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambdaBeforeACall\133useFir = false\135.txt"
new file mode 100644
index 0000000..212e96e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambdaBeforeACall\133useFir = false\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?): String? {
+    InlineNonComposable {
+        repeat(10) {
+            Test("InsideInline")
+        }
+    }
+    return Test("AfterInline")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int): String? {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Test("...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<Test("...>")
+  InlineNonComposable {
+    repeat(10) { it: Int ->
+      Test("InsideInline", %composer, 0b0110)
+    }
+  }
+  %composer.endReplaceableGroup()
+  val tmp0 = Test("AfterInline", %composer, 0b0110)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambdaBeforeACall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambdaBeforeACall\133useFir = true\135.txt"
new file mode 100644
index 0000000..212e96e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambdaBeforeACall\133useFir = true\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?): String? {
+    InlineNonComposable {
+        repeat(10) {
+            Test("InsideInline")
+        }
+    }
+    return Test("AfterInline")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int): String? {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Test("...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<Test("...>")
+  InlineNonComposable {
+    repeat(10) { it: Int ->
+      Test("InsideInline", %composer, 0b0110)
+    }
+  }
+  %composer.endReplaceableGroup()
+  val tmp0 = Test("AfterInline", %composer, 0b0110)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambda_nonLocalReturn\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambda_nonLocalReturn\133useFir = false\135.txt"
new file mode 100644
index 0000000..b5e8b9d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambda_nonLocalReturn\133useFir = false\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?) {
+    Inline1 {
+        Inline2 {
+            if (true) return@Inline1
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Inline...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Inline1({ %composer: Composer?, %changed: Int ->
+      val tmp0_marker = %composer.currentMarker
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Inline...>:Test.kt")
+      Inline2({ %composer: Composer?, %changed: Int ->
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C:Test.kt")
+        if (true) {
+          %composer.endToMarker(tmp0_marker)
+          return@Inline1
+        }
+        %composer.endReplaceableGroup()
+      }, %composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambda_nonLocalReturn\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambda_nonLocalReturn\133useFir = true\135.txt"
new file mode 100644
index 0000000..b5e8b9d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineLambda_nonLocalReturn\133useFir = true\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?) {
+    Inline1 {
+        Inline2 {
+            if (true) return@Inline1
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Inline...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Inline1({ %composer: Composer?, %changed: Int ->
+      val tmp0_marker = %composer.currentMarker
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Inline...>:Test.kt")
+      Inline2({ %composer: Composer?, %changed: Int ->
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C:Test.kt")
+        if (true) {
+          %composer.endToMarker(tmp0_marker)
+          return@Inline1
+        }
+        %composer.endReplaceableGroup()
+      }, %composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReadOnlySourceLocations\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReadOnlySourceLocations\133useFir = false\135.txt"
new file mode 100644
index 0000000..af124b2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReadOnlySourceLocations\133useFir = false\135.txt"
@@ -0,0 +1,84 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+
+val current
+    @Composable
+    @ReadOnlyComposable
+    get() = 0
+
+@Composable
+@ReadOnlyComposable
+fun calculateSometing(): Int {
+    return 0;
+}
+
+@Composable
+fun Test() {
+    val c = current
+    val cl = calculateSometing()
+    Layout {
+        Text("$c $cl")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val current: Int
+  @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
+  get() {
+    sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "<get-current> (Test.kt:7)")
+    }
+    val tmp0 = 0
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp0
+  }
+@Composable
+@ReadOnlyComposable
+fun calculateSometing(%composer: Composer?, %changed: Int): Int {
+  sourceInformationMarkerStart(%composer, <>, "C(calculateSometing):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, "calculateSometing (Test.kt:11)")
+  }
+  val tmp0 = 0
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+  return tmp0
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<curren...>,<calcul...>,<Layout>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "Test (Test.kt:16)")
+    }
+    val c = <get-current>(%composer, 0)
+    val cl = calculateSometing(%composer, 0)
+    Layout({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
+      Text("%c %cl", %composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReadOnlySourceLocations\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReadOnlySourceLocations\133useFir = true\135.txt"
new file mode 100644
index 0000000..af124b2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReadOnlySourceLocations\133useFir = true\135.txt"
@@ -0,0 +1,84 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+
+val current
+    @Composable
+    @ReadOnlyComposable
+    get() = 0
+
+@Composable
+@ReadOnlyComposable
+fun calculateSometing(): Int {
+    return 0;
+}
+
+@Composable
+fun Test() {
+    val c = current
+    val cl = calculateSometing()
+    Layout {
+        Text("$c $cl")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val current: Int
+  @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
+  get() {
+    sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "<get-current> (Test.kt:7)")
+    }
+    val tmp0 = 0
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp0
+  }
+@Composable
+@ReadOnlyComposable
+fun calculateSometing(%composer: Composer?, %changed: Int): Int {
+  sourceInformationMarkerStart(%composer, <>, "C(calculateSometing):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, "calculateSometing (Test.kt:11)")
+  }
+  val tmp0 = 0
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+  return tmp0
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<curren...>,<calcul...>,<Layout>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "Test (Test.kt:16)")
+    }
+    val c = <get-current>(%composer, 0)
+    val cl = calculateSometing(%composer, 0)
+    Layout({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
+      Text("%c %cl", %composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReturnLabel\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReturnLabel\133useFir = false\135.txt"
new file mode 100644
index 0000000..b0bbb6d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReturnLabel\133useFir = false\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+@NonRestartableComposable
+fun CustomTextBroken(condition: Boolean) {
+    FakeBox {
+        if (condition) {
+            return@FakeBox
+        }
+        A()
+    }
+}
+@Composable
+inline fun FakeBox(content: @Composable () -> Unit) {
+    content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun CustomTextBroken(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(CustomTextBroken)<FakeBo...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  FakeBox({ %composer: Composer?, %changed: Int ->
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C<A()>:Test.kt")
+    if (condition) {
+      %composer.endReplaceableGroup()
+      return@FakeBox
+    }
+    A(%composer, 0)
+    %composer.endReplaceableGroup()
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun FakeBox(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(FakeBox)<conten...>:Test.kt")
+  content(%composer, 0b1110 and %changed)
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReturnLabel\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReturnLabel\133useFir = true\135.txt"
new file mode 100644
index 0000000..b0bbb6d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInlineReturnLabel\133useFir = true\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+@NonRestartableComposable
+fun CustomTextBroken(condition: Boolean) {
+    FakeBox {
+        if (condition) {
+            return@FakeBox
+        }
+        A()
+    }
+}
+@Composable
+inline fun FakeBox(content: @Composable () -> Unit) {
+    content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun CustomTextBroken(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(CustomTextBroken)<FakeBo...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  FakeBox({ %composer: Composer?, %changed: Int ->
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C<A()>:Test.kt")
+    if (condition) {
+      %composer.endReplaceableGroup()
+      return@FakeBox
+    }
+    A(%composer, 0)
+    %composer.endReplaceableGroup()
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun FakeBox(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(FakeBox)<conten...>:Test.kt")
+  content(%composer, 0b1110 and %changed)
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun\133useFir = false\135.txt"
new file mode 100644
index 0000000..9925e02
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun\133useFir = false\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        if (condition) {
+            return
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>,<M3>,<A()>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (condition) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun\133useFir = true\135.txt"
new file mode 100644
index 0000000..9925e02
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun\133useFir = true\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        if (condition) {
+            return
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>,<M3>,<A()>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (condition) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun_CM3_RFun\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun_CM3_RFun\133useFir = false\135.txt"
new file mode 100644
index 0000000..04704d1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun_CM3_RFun\133useFir = false\135.txt"
@@ -0,0 +1,92 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(a: Boolean, b: Boolean) {
+    A()
+    M3 {
+        A()
+        if (a) {
+            return
+        }
+        A()
+    }
+    M3 {
+        A()
+        if (b) {
+            return
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Boolean, b: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>,<M3>,<M3>,<A()>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (a) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (b) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun_CM3_RFun\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun_CM3_RFun\133useFir = true\135.txt"
new file mode 100644
index 0000000..04704d1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RFun_CM3_RFun\133useFir = true\135.txt"
@@ -0,0 +1,92 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(a: Boolean, b: Boolean) {
+    A()
+    M3 {
+        A()
+        if (a) {
+            return
+        }
+        A()
+    }
+    M3 {
+        A()
+        if (b) {
+            return
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Boolean, b: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>,<M3>,<M3>,<A()>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (a) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (b) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RM3\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RM3\133useFir = false\135.txt"
new file mode 100644
index 0000000..54a51fd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RM3\133useFir = false\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        if (condition) {
+            return@M3
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>,<M3>,<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@M3
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RM3\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RM3\133useFir = true\135.txt"
new file mode 100644
index 0000000..54a51fd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_RM3\133useFir = true\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        if (condition) {
+            return@M3
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>,<M3>,<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@M3
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_Return_M3_CM3_Return_M3\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_Return_M3_CM3_Return_M3\133useFir = false\135.txt"
new file mode 100644
index 0000000..f8ec1a1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_Return_M3_CM3_Return_M3\133useFir = false\135.txt"
@@ -0,0 +1,76 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun testInline_M1_W_Return_Func(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        if (condition) {
+            return@M3
+        }
+        A()
+    }
+    M3 {
+        A()
+        if (condition) {
+            return@M3
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun testInline_M1_W_Return_Func(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(testInline_M1_W_Return_Func)<A()>,<M3>,<M3>,<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@M3
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@M3
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_Return_M3_CM3_Return_M3\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_Return_M3_CM3_Return_M3\133useFir = true\135.txt"
new file mode 100644
index 0000000..f8ec1a1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_CM3_Return_M3_CM3_Return_M3\133useFir = true\135.txt"
@@ -0,0 +1,76 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun testInline_M1_W_Return_Func(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        if (condition) {
+            return@M3
+        }
+        A()
+    }
+    M3 {
+        A()
+        if (condition) {
+            return@M3
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun testInline_M1_W_Return_Func(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(testInline_M1_W_Return_Func)<A()>,<M3>,<M3>,<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@M3
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@M3
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_Lambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_Lambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..b70c5c4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_Lambda\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+fun Test(condition: Boolean) {
+    T {
+        compose {
+            M1 {
+                if (condition) return@compose
+            }
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun Test(condition: Boolean) {
+  T {
+    %this%T.compose(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<M1>:Test.kt")
+      val tmp0_marker = %composer.currentMarker
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        M1({ %composer: Composer?, %changed: Int ->
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C:Test.kt")
+          if (condition) {
+            %composer.endToMarker(tmp0_marker)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+            return@composableLambdaInstance
+          }
+          %composer.endReplaceableGroup()
+        }, %composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    )
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_Lambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_Lambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..b70c5c4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_Lambda\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+fun Test(condition: Boolean) {
+    T {
+        compose {
+            M1 {
+                if (condition) return@compose
+            }
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun Test(condition: Boolean) {
+  T {
+    %this%T.compose(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<M1>:Test.kt")
+      val tmp0_marker = %composer.currentMarker
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        M1({ %composer: Composer?, %changed: Int ->
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C:Test.kt")
+          if (condition) {
+            %composer.endToMarker(tmp0_marker)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+            return@composableLambdaInstance
+          }
+          %composer.endReplaceableGroup()
+        }, %composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    )
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M1_W_Return_Func\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M1_W_Return_Func\133useFir = false\135.txt"
new file mode 100644
index 0000000..3e4b12f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M1_W_Return_Func\133useFir = false\135.txt"
@@ -0,0 +1,76 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun testInline_M1_W_Return_Func(condition: Boolean) {
+    A()
+    M1 {
+        A()
+        while(true) {
+            A()
+            if (condition) {
+                return
+            }
+            A()
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun testInline_M1_W_Return_Func(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(testInline_M1_W_Return_Func)<A()>,<M1>,<A()>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "*<A()>,<A()>")
+      while (true) {
+        A(%composer, 0)
+        if (condition) {
+          %composer.endToMarker(tmp0_marker)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+          %composer@testInline_M1_W_Return_Func.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+          return
+        }
+        A(%composer, 0)
+      }
+      %composer.endReplaceableGroup()
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M1_W_Return_Func\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M1_W_Return_Func\133useFir = true\135.txt"
new file mode 100644
index 0000000..3e4b12f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M1_W_Return_Func\133useFir = true\135.txt"
@@ -0,0 +1,76 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun testInline_M1_W_Return_Func(condition: Boolean) {
+    A()
+    M1 {
+        A()
+        while(true) {
+            A()
+            if (condition) {
+                return
+            }
+            A()
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun testInline_M1_W_Return_Func(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(testInline_M1_W_Return_Func)<A()>,<M1>,<A()>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "*<A()>,<A()>")
+      while (true) {
+        A(%composer, 0)
+        if (condition) {
+          %composer.endToMarker(tmp0_marker)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+          %composer@testInline_M1_W_Return_Func.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+          return
+        }
+        A(%composer, 0)
+      }
+      %composer.endReplaceableGroup()
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    testInline_M1_W_Return_Func(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M1\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M1\133useFir = false\135.txt"
new file mode 100644
index 0000000..f6b0425
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M1\133useFir = false\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test_M3_M1_Return_M1(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        M1 {
+            if (condition) {
+                return@M1
+            }
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test_M3_M1_Return_M1(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test_M3_M1_Return_M1)<A()>,<M3>,<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<A()>,<M1>,<A()>:Test.kt")
+      A(%composer, 0)
+      M1({ %composer: Composer?, %changed: Int ->
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C:Test.kt")
+        if (condition) {
+          %composer.endReplaceableGroup()
+          return@M1
+        }
+        %composer.endReplaceableGroup()
+      }, %composer, 0)
+      A(%composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test_M3_M1_Return_M1(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M1\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M1\133useFir = true\135.txt"
new file mode 100644
index 0000000..f6b0425
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M1\133useFir = true\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test_M3_M1_Return_M1(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        M1 {
+            if (condition) {
+                return@M1
+            }
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test_M3_M1_Return_M1(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test_M3_M1_Return_M1)<A()>,<M3>,<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<A()>,<M1>,<A()>:Test.kt")
+      A(%composer, 0)
+      M1({ %composer: Composer?, %changed: Int ->
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C:Test.kt")
+        if (condition) {
+          %composer.endReplaceableGroup()
+          return@M1
+        }
+        %composer.endReplaceableGroup()
+      }, %composer, 0)
+      A(%composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test_M3_M1_Return_M1(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M3\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M3\133useFir = false\135.txt"
new file mode 100644
index 0000000..a2422c0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M3\133useFir = false\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test_M3_M1_Return_M3(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        M1 {
+            if (condition) {
+                return@M3
+            }
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test_M3_M1_Return_M3(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test_M3_M1_Return_M3)<A()>,<M3>,<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      val tmp0_marker = %composer.currentMarker
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<M1>,<A()>:Test.kt")
+      A(%composer, 0)
+      M1({ %composer: Composer?, %changed: Int ->
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C:Test.kt")
+        if (condition) {
+          %composer.endToMarker(tmp0_marker)
+          return@M3
+        }
+        %composer.endReplaceableGroup()
+      }, %composer, 0)
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test_M3_M1_Return_M3(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M3\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M3\133useFir = true\135.txt"
new file mode 100644
index 0000000..a2422c0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testInline_M3_M1_Return_M3\133useFir = true\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test_M3_M1_Return_M3(condition: Boolean) {
+    A()
+    M3 {
+        A()
+        M1 {
+            if (condition) {
+                return@M3
+            }
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test_M3_M1_Return_M3(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test_M3_M1_Return_M3)<A()>,<M3>,<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    M3({ %composer: Composer?, %changed: Int ->
+      val tmp0_marker = %composer.currentMarker
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<M1>,<A()>:Test.kt")
+      A(%composer, 0)
+      M1({ %composer: Composer?, %changed: Int ->
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C:Test.kt")
+        if (condition) {
+          %composer.endToMarker(tmp0_marker)
+          return@M3
+        }
+        %composer.endReplaceableGroup()
+      }, %composer, 0)
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test_M3_M1_Return_M3(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAsAValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAsAValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..b83cafc
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAsAValue\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    val y = key(x) { R() }
+    P(y)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<P(y)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val y = <block>{
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<R()>")
+    val tmp0 = R(%composer, 0)
+    %composer.endMovableGroup()
+    tmp0
+  }
+  P(y, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAsAValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAsAValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..b83cafc
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAsAValue\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    val y = key(x) { R() }
+    P(y)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<P(y)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val y = <block>{
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<R()>")
+    val tmp0 = R(%composer, 0)
+    %composer.endMovableGroup()
+    tmp0
+  }
+  P(y, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..572fe15
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    key(x) {
+        A(a)
+    }
+    A(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startMovableGroup(<>, x)
+  sourceInformation(%composer, "<A(a)>")
+  A(a, %composer, 0)
+  %composer.endMovableGroup()
+  A(b, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..572fe15
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    key(x) {
+        A(a)
+    }
+    A(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startMovableGroup(<>, x)
+  sourceInformation(%composer, "<A(a)>")
+  A(a, %composer, 0)
+  %composer.endMovableGroup()
+  A(b, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsBefore\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsBefore\133useFir = false\135.txt"
new file mode 100644
index 0000000..7df902a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsBefore\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    A(a)
+    key(x) {
+        A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(a)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(a, %composer, 0)
+  %composer.startMovableGroup(<>, x)
+  sourceInformation(%composer, "<A(b)>")
+  A(b, %composer, 0)
+  %composer.endMovableGroup()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsBefore\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsBefore\133useFir = true\135.txt"
new file mode 100644
index 0000000..7df902a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevelAndCallsBefore\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    A(a)
+    key(x) {
+        A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(a)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(a, %composer, 0)
+  %composer.startMovableGroup(<>, x)
+  sourceInformation(%composer, "<A(b)>")
+  A(b, %composer, 0)
+  %composer.endMovableGroup()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevel\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevel\133useFir = false\135.txt"
new file mode 100644
index 0000000..849779e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevel\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    key(x) {
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startMovableGroup(<>, x)
+  sourceInformation(%composer, "<A()>")
+  A(%composer, 0)
+  %composer.endMovableGroup()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevel\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevel\133useFir = true\135.txt"
new file mode 100644
index 0000000..849779e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyAtRootLevel\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    key(x) {
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startMovableGroup(<>, x)
+  sourceInformation(%composer, "<A()>")
+  A(%composer, 0)
+  %composer.endMovableGroup()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..c1aac5b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        key(x) {
+            A(a)
+        }
+        A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(a)>")
+    A(a, %composer, 0)
+    %composer.endMovableGroup()
+    A(b, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..c1aac5b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        key(x) {
+            A(a)
+        }
+        A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(a)>")
+    A(a, %composer, 0)
+    %composer.endMovableGroup()
+    A(b, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsBefore\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsBefore\133useFir = false\135.txt"
new file mode 100644
index 0000000..ed1aac1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsBefore\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        A(a)
+        key(x) {
+            A(b)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(a)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(a, %composer, 0)
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsBefore\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsBefore\133useFir = true\135.txt"
new file mode 100644
index 0000000..ed1aac1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIfAndCallsBefore\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        A(a)
+        key(x) {
+            A(b)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(a)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(a, %composer, 0)
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIf\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIf\133useFir = false\135.txt"
new file mode 100644
index 0000000..9e54adf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIf\133useFir = false\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        key(x) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A()>")
+    A(%composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIf\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIf\133useFir = true\135.txt"
new file mode 100644
index 0000000..9e54adf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyInIf\133useFir = true\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        key(x) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A()>")
+    A(%composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithComposableValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithComposableValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..7cf8568
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithComposableValue\133useFir = false\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while(x > 0) {
+        key(R()) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<R()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    %composer.startMovableGroup(<>, R(%composer, 0))
+    sourceInformation(%composer, "<A()>")
+    A(%composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithComposableValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithComposableValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..7cf8568
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithComposableValue\133useFir = true\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while(x > 0) {
+        key(R()) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<R()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    %composer.startMovableGroup(<>, R(%composer, 0))
+    sourceInformation(%composer, "<A()>")
+    A(%composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithLotsOfValues\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithLotsOfValues\133useFir = false\135.txt"
new file mode 100644
index 0000000..ffe5ab1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithLotsOfValues\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Int, b: Int, c: Int, d: Int) {
+    key(a, b, c, d) {
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Int, b: Int, c: Int, d: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startMovableGroup(<>, %composer.joinKey(%composer.joinKey(%composer.joinKey(a, b), c), d))
+  sourceInformation(%composer, "<A()>")
+  A(%composer, 0)
+  %composer.endMovableGroup()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithLotsOfValues\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithLotsOfValues\133useFir = true\135.txt"
new file mode 100644
index 0000000..ffe5ab1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testKeyWithLotsOfValues\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Int, b: Int, c: Int, d: Int) {
+    key(a, b, c, d) {
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Int, b: Int, c: Int, d: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startMovableGroup(<>, %composer.joinKey(%composer.joinKey(%composer.joinKey(a, b), c), d))
+  sourceInformation(%composer, "<A()>")
+  A(%composer, 0)
+  %composer.endMovableGroup()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithComposableCalls\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithComposableCalls\133useFir = false\135.txt"
new file mode 100644
index 0000000..3e107a8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithComposableCalls\133useFir = false\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(x: Int?) {
+  x?.let {
+    if (it > 0) {
+      A(a)
+    }
+    A(b)
+  }
+  A(c)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(x: Int?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(c)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val tmp0_safe_receiver = x
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A(b)>")
+    val tmp0_group = when {
+      tmp0_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp0_safe_receiver.let { it: Int ->
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "<A(a)>")
+          if (it > 0) {
+            A(a, %composer, 0)
+          }
+          %composer.endReplaceableGroup()
+          A(b, %composer, 0)
+        }
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmp0_group
+    A(c, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithComposableCalls\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithComposableCalls\133useFir = true\135.txt"
new file mode 100644
index 0000000..3e107a8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithComposableCalls\133useFir = true\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(x: Int?) {
+  x?.let {
+    if (it > 0) {
+      A(a)
+    }
+    A(b)
+  }
+  A(c)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(x: Int?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(c)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val tmp0_safe_receiver = x
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A(b)>")
+    val tmp0_group = when {
+      tmp0_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp0_safe_receiver.let { it: Int ->
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "<A(a)>")
+          if (it > 0) {
+            A(a, %composer, 0)
+          }
+          %composer.endReplaceableGroup()
+          A(b, %composer, 0)
+        }
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmp0_group
+    A(c, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithoutComposableCalls\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithoutComposableCalls\133useFir = false\135.txt"
new file mode 100644
index 0000000..7f9961f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithoutComposableCalls\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(x: Int?) {
+  x?.let {
+    if (it > 0) {
+      NA()
+    }
+    NA()
+  }
+  A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(x: Int?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    x?.let { it: Int ->
+      if (it > 0) {
+        NA()
+      }
+      NA()
+    }
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithoutComposableCalls\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithoutComposableCalls\133useFir = true\135.txt"
new file mode 100644
index 0000000..7f9961f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLetWithoutComposableCalls\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(x: Int?) {
+  x?.let {
+    if (it > 0) {
+      NA()
+    }
+    NA()
+  }
+  A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(x: Int?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    x?.let { it: Int ->
+      if (it > 0) {
+        NA()
+      }
+      NA()
+    }
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithBreak\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithBreak\133useFir = false\135.txt"
new file mode 100644
index 0000000..46ab04c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithBreak\133useFir = false\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>) {
+    a@while (a.hasNext()) {
+        val x = a.next()
+        b@while (b.hasNext()) {
+            val y = b.next()
+            if (y == x) {
+                break@a
+            }
+            A()
+        }
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  a@while (a.hasNext()) {
+    val x = a.next()
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A()>")
+    b@while (b.hasNext()) {
+      val y = b.next()
+      if (y == x) {
+        %composer.endReplaceableGroup()
+        break@a
+      }
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithBreak\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithBreak\133useFir = true\135.txt"
new file mode 100644
index 0000000..46ab04c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithBreak\133useFir = true\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>) {
+    a@while (a.hasNext()) {
+        val x = a.next()
+        b@while (b.hasNext()) {
+            val y = b.next()
+            if (y == x) {
+                break@a
+            }
+            A()
+        }
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  a@while (a.hasNext()) {
+    val x = a.next()
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A()>")
+    b@while (b.hasNext()) {
+      val y = b.next()
+      if (y == x) {
+        %composer.endReplaceableGroup()
+        break@a
+      }
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithReturn\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithReturn\133useFir = false\135.txt"
new file mode 100644
index 0000000..1d82d7b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithReturn\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>) {
+    while (a.hasNext()) {
+        val x = a.next()
+        if (x > 100) {
+            return
+        }
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (a.hasNext()) {
+    val x = a.next()
+    if (x > 100) {
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+      return
+    }
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithReturn\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithReturn\133useFir = true\135.txt"
new file mode 100644
index 0000000..1d82d7b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testLoopWithReturn\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>) {
+    while (a.hasNext()) {
+        val x = a.next()
+        if (x > 100) {
+            return
+        }
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (a.hasNext()) {
+    val x = a.next()
+    if (x > 100) {
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+      return
+    }
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testMultipleNestedInlines\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testMultipleNestedInlines\133useFir = false\135.txt"
new file mode 100644
index 0000000..b048ac1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testMultipleNestedInlines\133useFir = false\135.txt"
@@ -0,0 +1,56 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun AttemptedToRealizeGroupTwice() {
+    Wrapper {
+        repeat(1) {
+            repeat(1) {
+                Leaf(0)
+            }
+            Leaf(0)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun AttemptedToRealizeGroupTwice(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(AttemptedToRealizeGroupTwice)<Wrappe...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Wrapper({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "*<Leaf(0...>")
+      repeat(1) { it: Int ->
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "*<Leaf(0...>")
+        repeat(1) { it: Int ->
+          Leaf(0, %composer, 0b0110, 0)
+        }
+        %composer.endReplaceableGroup()
+        Leaf(0, %composer, 0b0110, 0)
+      }
+      %composer.endReplaceableGroup()
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    AttemptedToRealizeGroupTwice(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testMultipleNestedInlines\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testMultipleNestedInlines\133useFir = true\135.txt"
new file mode 100644
index 0000000..b048ac1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testMultipleNestedInlines\133useFir = true\135.txt"
@@ -0,0 +1,56 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun AttemptedToRealizeGroupTwice() {
+    Wrapper {
+        repeat(1) {
+            repeat(1) {
+                Leaf(0)
+            }
+            Leaf(0)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun AttemptedToRealizeGroupTwice(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(AttemptedToRealizeGroupTwice)<Wrappe...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Wrapper({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "*<Leaf(0...>")
+      repeat(1) { it: Int ->
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "*<Leaf(0...>")
+        repeat(1) { it: Int ->
+          Leaf(0, %composer, 0b0110, 0)
+        }
+        %composer.endReplaceableGroup()
+        Leaf(0, %composer, 0b0110, 0)
+      }
+      %composer.endReplaceableGroup()
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    AttemptedToRealizeGroupTwice(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoopsAndBreak\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoopsAndBreak\133useFir = false\135.txt"
new file mode 100644
index 0000000..728f598
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoopsAndBreak\133useFir = false\135.txt"
@@ -0,0 +1,80 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>) {
+    a@while (a.hasNext()) {
+        val x = a.next()
+        if (x == 0) {
+            break
+        }
+        b@while (b.hasNext()) {
+            val y = b.next()
+            if (y == 0) {
+                break
+            }
+            if (y == x) {
+                break@a
+            }
+            if (y > 100) {
+                return
+            }
+            A()
+        }
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  a@while (a.hasNext()) {
+    val x = a.next()
+    if (x == 0) {
+      break
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A()>")
+    b@while (b.hasNext()) {
+      val y = b.next()
+      if (y == 0) {
+        break
+      }
+      if (y == x) {
+        %composer.endReplaceableGroup()
+        break@a
+      }
+      if (y > 100) {
+        %composer.endReplaceableGroup()
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer.endReplaceableGroup()
+        return
+      }
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoopsAndBreak\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoopsAndBreak\133useFir = true\135.txt"
new file mode 100644
index 0000000..9f4feab
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoopsAndBreak\133useFir = true\135.txt"
@@ -0,0 +1,80 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>) {
+    a@while (a.hasNext()) {
+        val x = a.next()
+        if (x == 0) {
+            break
+        }
+        b@while (b.hasNext()) {
+            val y = b.next()
+            if (y == 0) {
+                break
+            }
+            if (y == x) {
+                break@a
+            }
+            if (y > 100) {
+                return
+            }
+            A()
+        }
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  a@while (a.hasNext()) {
+    val x = a.next()
+    if (x == 0) {
+      break@a
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A()>")
+    b@while (b.hasNext()) {
+      val y = b.next()
+      if (y == 0) {
+        break@b
+      }
+      if (y == x) {
+        %composer.endReplaceableGroup()
+        break@a
+      }
+      if (y > 100) {
+        %composer.endReplaceableGroup()
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer.endReplaceableGroup()
+        return
+      }
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoops\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoops\133useFir = false\135.txt"
new file mode 100644
index 0000000..485b249
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoops\133useFir = false\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>) {
+    a@while (a.hasNext()) {
+        b@while (b.hasNext()) {
+            A()
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<A()>")
+  a@while (a.hasNext()) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A()>")
+    b@while (b.hasNext()) {
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    A(%composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoops\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoops\133useFir = true\135.txt"
new file mode 100644
index 0000000..485b249
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testNestedLoops\133useFir = true\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>) {
+    a@while (a.hasNext()) {
+        b@while (b.hasNext()) {
+            A()
+        }
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<A()>")
+  a@while (a.hasNext()) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A()>")
+    b@while (b.hasNext()) {
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    A(%composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = false\135.txt"
new file mode 100644
index 0000000..0cdc751
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = false\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Example() {
+    B() || B()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<B()>,<B()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0_group = B(%composer, 0) || B(%composer, 0)
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = true\135.txt"
new file mode 100644
index 0000000..0cdc751
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOR\133useFir = true\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Example() {
+    B() || B()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<B()>,<B()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0_group = B(%composer, 0) || B(%composer, 0)
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOrderingOfPushedEndCallsWithEarlyReturns\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOrderingOfPushedEndCallsWithEarlyReturns\133useFir = false\135.txt"
new file mode 100644
index 0000000..d4f4620
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOrderingOfPushedEndCallsWithEarlyReturns\133useFir = false\135.txt"
@@ -0,0 +1,72 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        val j = i
+        val k = i
+        val l = i
+        P(i)
+        if (i == 0) {
+            P(j)
+            return
+        } else {
+            P(k)
+        }
+        P(l)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>,<P(l)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    val j = i
+    val k = i
+    val l = i
+    P(i, %composer, 0)
+    if (i == 0) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<P(j)>")
+      P(j, %composer, 0)
+      %composer.endReplaceableGroup()
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+        Example(items, %composer, updateChangedFlags(%changed or 0b0001))
+      }
+      return
+    } else {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<P(k)>")
+      P(k, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    P(l, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOrderingOfPushedEndCallsWithEarlyReturns\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOrderingOfPushedEndCallsWithEarlyReturns\133useFir = true\135.txt"
new file mode 100644
index 0000000..d4f4620
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testOrderingOfPushedEndCallsWithEarlyReturns\133useFir = true\135.txt"
@@ -0,0 +1,72 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        val j = i
+        val k = i
+        val l = i
+        P(i)
+        if (i == 0) {
+            P(j)
+            return
+        } else {
+            P(k)
+        }
+        P(l)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>,<P(l)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    val j = i
+    val k = i
+    val l = i
+    P(i, %composer, 0)
+    if (i == 0) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<P(j)>")
+      P(j, %composer, 0)
+      %composer.endReplaceableGroup()
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+        Example(items, %composer, updateChangedFlags(%changed or 0b0001))
+      }
+      return
+    } else {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<P(k)>")
+      P(k, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    P(l, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testParameterOrderInformation\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testParameterOrderInformation\133useFir = false\135.txt"
new file mode 100644
index 0000000..094dfc9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testParameterOrderInformation\133useFir = false\135.txt"
@@ -0,0 +1,999 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable fun Test01(p0: Int, p1: Int, p2: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test02(p0: Int, p1: Int, p3: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test03(p0: Int, p2: Int, p1: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test04(p0: Int, p2: Int, p3: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test05(p0: Int, p3: Int, p1: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test06(p0: Int, p3: Int, p2: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test07(p1: Int, p0: Int, p2: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test08(p1: Int, p0: Int, p3: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test09(p1: Int, p2: Int, p0: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test00(p1: Int, p2: Int, p3: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test11(p1: Int, p3: Int, p0: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test12(p1: Int, p3: Int, p2: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test13(p2: Int, p0: Int, p1: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test14(p2: Int, p0: Int, p3: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test15(p2: Int, p1: Int, p0: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test16(p2: Int, p1: Int, p3: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test17(p2: Int, p3: Int, p0: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test18(p2: Int, p3: Int, p1: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test19(p3: Int, p0: Int, p1: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test20(p3: Int, p0: Int, p2: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test21(p3: Int, p1: Int, p0: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test22(p3: Int, p1: Int, p2: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test23(p3: Int, p2: Int, p0: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test24(p3: Int, p2: Int, p1: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test01(p0: Int, p1: Int, p2: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test01):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test01(p0, p1, p2, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test02(p0: Int, p1: Int, p3: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test02)P(!2,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test02(p0, p1, p3, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test03(p0: Int, p2: Int, p1: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test03)P(!1,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test03(p0, p2, p1, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test04(p0: Int, p2: Int, p3: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test04)P(!1,2,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test04(p0, p2, p3, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test05(p0: Int, p3: Int, p1: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test05)P(!1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test05(p0, p3, p1, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test06(p0: Int, p3: Int, p2: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test06)P(!1,3,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test06(p0, p3, p2, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test07(p1: Int, p0: Int, p2: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test07)P(1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test07(p1, p0, p2, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test08(p1: Int, p0: Int, p3: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test08)P(1!1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test08(p1, p0, p3, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test09(p1: Int, p2: Int, p0: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test09)P(1,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test09(p1, p2, p0, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test00(p1: Int, p2: Int, p3: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test00)P(1,2,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test00(p1, p2, p3, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test11(p1: Int, p3: Int, p0: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test11)P(1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test11(p1, p3, p0, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test12(p1: Int, p3: Int, p2: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test12)P(1,3,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test12(p1, p3, p2, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test13(p2: Int, p0: Int, p1: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test13)P(2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test13(p2, p0, p1, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test14(p2: Int, p0: Int, p3: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test14)P(2!1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test14(p2, p0, p3, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test15(p2: Int, p1: Int, p0: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test15)P(2,1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test15(p2, p1, p0, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test16(p2: Int, p1: Int, p3: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test16)P(2,1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test16(p2, p1, p3, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test17(p2: Int, p3: Int, p0: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test17)P(2,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test17(p2, p3, p0, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test18(p2: Int, p3: Int, p1: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test18)P(2,3,1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test18(p2, p3, p1, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test19(p3: Int, p0: Int, p1: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test19)P(3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test19(p3, p0, p1, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test20(p3: Int, p0: Int, p2: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test20)P(3!1,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test20(p3, p0, p2, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test21(p3: Int, p1: Int, p0: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test21)P(3,1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test21(p3, p1, p0, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test22(p3: Int, p1: Int, p2: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test22)P(3,1,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test22(p3, p1, p2, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test23(p3: Int, p2: Int, p0: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test23)P(3,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test23(p3, p2, p0, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test24(p3: Int, p2: Int, p1: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test24)P(3,2,1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test24(p3, p2, p1, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testParameterOrderInformation\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testParameterOrderInformation\133useFir = true\135.txt"
new file mode 100644
index 0000000..094dfc9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testParameterOrderInformation\133useFir = true\135.txt"
@@ -0,0 +1,999 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable fun Test01(p0: Int, p1: Int, p2: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test02(p0: Int, p1: Int, p3: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test03(p0: Int, p2: Int, p1: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test04(p0: Int, p2: Int, p3: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test05(p0: Int, p3: Int, p1: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test06(p0: Int, p3: Int, p2: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test07(p1: Int, p0: Int, p2: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test08(p1: Int, p0: Int, p3: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test09(p1: Int, p2: Int, p0: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test00(p1: Int, p2: Int, p3: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test11(p1: Int, p3: Int, p0: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test12(p1: Int, p3: Int, p2: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test13(p2: Int, p0: Int, p1: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test14(p2: Int, p0: Int, p3: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test15(p2: Int, p1: Int, p0: Int, p3: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test16(p2: Int, p1: Int, p3: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test17(p2: Int, p3: Int, p0: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test18(p2: Int, p3: Int, p1: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test19(p3: Int, p0: Int, p1: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test20(p3: Int, p0: Int, p2: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test21(p3: Int, p1: Int, p0: Int, p2: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test22(p3: Int, p1: Int, p2: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test23(p3: Int, p2: Int, p0: Int, p1: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+@Composable fun Test24(p3: Int, p2: Int, p1: Int, p0: Int) {
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test01(p0: Int, p1: Int, p2: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test01):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test01(p0, p1, p2, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test02(p0: Int, p1: Int, p3: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test02)P(!2,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test02(p0, p1, p3, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test03(p0: Int, p2: Int, p1: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test03)P(!1,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test03(p0, p2, p1, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test04(p0: Int, p2: Int, p3: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test04)P(!1,2,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test04(p0, p2, p3, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test05(p0: Int, p3: Int, p1: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test05)P(!1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test05(p0, p3, p1, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test06(p0: Int, p3: Int, p2: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test06)P(!1,3,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test06(p0, p3, p2, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test07(p1: Int, p0: Int, p2: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test07)P(1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test07(p1, p0, p2, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test08(p1: Int, p0: Int, p3: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test08)P(1!1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test08(p1, p0, p3, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test09(p1: Int, p2: Int, p0: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test09)P(1,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test09(p1, p2, p0, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test00(p1: Int, p2: Int, p3: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test00)P(1,2,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test00(p1, p2, p3, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test11(p1: Int, p3: Int, p0: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test11)P(1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test11(p1, p3, p0, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test12(p1: Int, p3: Int, p2: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test12)P(1,3,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test12(p1, p3, p2, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test13(p2: Int, p0: Int, p1: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test13)P(2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test13(p2, p0, p1, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test14(p2: Int, p0: Int, p3: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test14)P(2!1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test14(p2, p0, p3, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test15(p2: Int, p1: Int, p0: Int, p3: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test15)P(2,1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test15(p2, p1, p0, p3, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test16(p2: Int, p1: Int, p3: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test16)P(2,1,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test16(p2, p1, p3, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test17(p2: Int, p3: Int, p0: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test17)P(2,3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test17(p2, p3, p0, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test18(p2: Int, p3: Int, p1: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test18)P(2,3,1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test18(p2, p3, p1, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test19(p3: Int, p0: Int, p1: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test19)P(3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test19(p3, p0, p1, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test20(p3: Int, p0: Int, p2: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test20)P(3!1,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test20(p3, p0, p2, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test21(p3: Int, p1: Int, p0: Int, p2: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test21)P(3,1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test21(p3, p1, p0, p2, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test22(p3: Int, p1: Int, p2: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test22)P(3,1,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test22(p3, p1, p2, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test23(p3: Int, p2: Int, p0: Int, p1: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test23)P(3,2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test23(p3, p2, p0, p1, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test24(p3: Int, p2: Int, p1: Int, p0: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test24)P(3,2,1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p2)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p1)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(p0)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(p0)
+    used(p1)
+    used(p2)
+    used(p3)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test24(p3, p2, p1, p0, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyComposableWithEarlyReturn\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyComposableWithEarlyReturn\133useFir = false\135.txt"
new file mode 100644
index 0000000..0eba39f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyComposableWithEarlyReturn\133useFir = false\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@ReadOnlyComposable
+@Composable
+fun getSomeValue(a: Int): Int {
+    if (a < 100) return 0
+    return 1
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@ReadOnlyComposable
+@Composable
+fun getSomeValue(a: Int, %composer: Composer?, %changed: Int): Int {
+  sourceInformationMarkerStart(%composer, <>, "C(getSomeValue):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (a < 100) {
+    val tmp1_return = 0
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp1_return
+  }
+  val tmp0 = 1
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyComposableWithEarlyReturn\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyComposableWithEarlyReturn\133useFir = true\135.txt"
new file mode 100644
index 0000000..0eba39f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyComposableWithEarlyReturn\133useFir = true\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@ReadOnlyComposable
+@Composable
+fun getSomeValue(a: Int): Int {
+    if (a < 100) return 0
+    return 1
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@ReadOnlyComposable
+@Composable
+fun getSomeValue(a: Int, %composer: Composer?, %changed: Int): Int {
+  sourceInformationMarkerStart(%composer, <>, "C(getSomeValue):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (a < 100) {
+    val tmp1_return = 0
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp1_return
+  }
+  val tmp0 = 1
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyInlineValSourceLocations\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyInlineValSourceLocations\133useFir = false\135.txt"
new file mode 100644
index 0000000..18fb803
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyInlineValSourceLocations\133useFir = false\135.txt"
@@ -0,0 +1,114 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+
+class CurrentHolder {
+    inline val current: Int
+        @ReadOnlyComposable
+        @Composable
+        get() = 0
+}
+
+class HolderHolder {
+    private val _currentHolder = CurrentHolder()
+    val current: Int
+        @ReadOnlyComposable
+        @Composable
+        get() = _currentHolder.current
+}
+
+val holderHolder = HolderHolder()
+
+@Composable
+@ReadOnlyComposable
+fun calculateSomething(): Int {
+    return 0;
+}
+
+@Composable
+fun Test() {
+    val c = holderHolder.current
+    val cl = calculateSomething()
+    Layout {
+        Text("$c $cl")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class CurrentHolder {
+  val current: Int
+    @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
+    get() {
+      sourceInformationMarkerStart(%composer, <>, "CC:Test.kt")
+      val tmp0 = 0
+      sourceInformationMarkerEnd(%composer)
+      return tmp0
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class HolderHolder {
+  val _currentHolder: CurrentHolder = CurrentHolder()
+  val current: Int
+    @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
+    get() {
+      sourceInformationMarkerStart(%composer, <>, "C<curren...>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, "HolderHolder.<get-current> (Test.kt:16)")
+      }
+      val tmp0 = _currentHolder.<get-current>(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      sourceInformationMarkerEnd(%composer)
+      return tmp0
+    }
+  static val %stable: Int = 0
+}
+val holderHolder: HolderHolder = HolderHolder()
+@Composable
+@ReadOnlyComposable
+fun calculateSomething(%composer: Composer?, %changed: Int): Int {
+  sourceInformationMarkerStart(%composer, <>, "C(calculateSomething):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, "calculateSomething (Test.kt:23)")
+  }
+  val tmp0 = 0
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+  return tmp0
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<curren...>,<calcul...>,<Layout>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "Test (Test.kt:28)")
+    }
+    val c = holderHolder.<get-current>(%composer, 0b0110)
+    val cl = calculateSomething(%composer, 0)
+    Layout({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
+      Text("%c %cl", %composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyInlineValSourceLocations\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyInlineValSourceLocations\133useFir = true\135.txt"
new file mode 100644
index 0000000..18fb803
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReadOnlyInlineValSourceLocations\133useFir = true\135.txt"
@@ -0,0 +1,114 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+
+class CurrentHolder {
+    inline val current: Int
+        @ReadOnlyComposable
+        @Composable
+        get() = 0
+}
+
+class HolderHolder {
+    private val _currentHolder = CurrentHolder()
+    val current: Int
+        @ReadOnlyComposable
+        @Composable
+        get() = _currentHolder.current
+}
+
+val holderHolder = HolderHolder()
+
+@Composable
+@ReadOnlyComposable
+fun calculateSomething(): Int {
+    return 0;
+}
+
+@Composable
+fun Test() {
+    val c = holderHolder.current
+    val cl = calculateSomething()
+    Layout {
+        Text("$c $cl")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class CurrentHolder {
+  val current: Int
+    @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
+    get() {
+      sourceInformationMarkerStart(%composer, <>, "CC:Test.kt")
+      val tmp0 = 0
+      sourceInformationMarkerEnd(%composer)
+      return tmp0
+    }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class HolderHolder {
+  val _currentHolder: CurrentHolder = CurrentHolder()
+  val current: Int
+    @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
+    get() {
+      sourceInformationMarkerStart(%composer, <>, "C<curren...>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, "HolderHolder.<get-current> (Test.kt:16)")
+      }
+      val tmp0 = _currentHolder.<get-current>(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      sourceInformationMarkerEnd(%composer)
+      return tmp0
+    }
+  static val %stable: Int = 0
+}
+val holderHolder: HolderHolder = HolderHolder()
+@Composable
+@ReadOnlyComposable
+fun calculateSomething(%composer: Composer?, %changed: Int): Int {
+  sourceInformationMarkerStart(%composer, <>, "C(calculateSomething):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, "calculateSomething (Test.kt:23)")
+  }
+  val tmp0 = 0
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+  return tmp0
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<curren...>,<calcul...>,<Layout>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "Test (Test.kt:28)")
+    }
+    val c = holderHolder.<get-current>(%composer, 0b0110)
+    val cl = calculateSomething(%composer, 0)
+    Layout({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
+      Text("%c %cl", %composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInConditionalCallArgument\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInConditionalCallArgument\133useFir = false\135.txt"
new file mode 100644
index 0000000..6320122
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInConditionalCallArgument\133useFir = false\135.txt"
@@ -0,0 +1,56 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?) {
+    Test(
+        if (param == null) {
+           remember { "" }
+        } else {
+            null
+        },
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Test(>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(param)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Test(<block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<rememb...>")
+      val tmp0_group = if (param == null) {
+        remember({
+          ""
+        }, %composer, 0)
+      } else {
+        null
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInConditionalCallArgument\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInConditionalCallArgument\133useFir = true\135.txt"
new file mode 100644
index 0000000..6320122
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInConditionalCallArgument\133useFir = true\135.txt"
@@ -0,0 +1,56 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?) {
+    Test(
+        if (param == null) {
+           remember { "" }
+        } else {
+            null
+        },
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Test(>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(param)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Test(<block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<rememb...>")
+      val tmp0_group = if (param == null) {
+        remember({
+          ""
+        }, %composer, 0)
+      } else {
+        null
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(param, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInNestedConditionalCallArgument\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInNestedConditionalCallArgument\133useFir = false\135.txt"
new file mode 100644
index 0000000..18d298e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInNestedConditionalCallArgument\133useFir = false\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?): String? {
+    return Test(
+        if (param == null) {
+           Test(
+                if (param == null) {
+                    remember { "" }
+                } else {
+                    null
+                }
+           )
+        } else {
+            null
+        },
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int): String? {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Test(>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = Test(<block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<Test(>")
+    val tmp2_group = if (param == null) {
+      Test(<block>{
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<rememb...>")
+        val tmp1_group = if (param == null) {
+          remember({
+            ""
+          }, %composer, 0)
+        } else {
+          null
+        }
+        %composer.endReplaceableGroup()
+        tmp1_group
+      }, %composer, 0)
+    } else {
+      null
+    }
+    %composer.endReplaceableGroup()
+    tmp2_group
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInNestedConditionalCallArgument\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInNestedConditionalCallArgument\133useFir = true\135.txt"
new file mode 100644
index 0000000..18d298e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRememberInNestedConditionalCallArgument\133useFir = true\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test(param: String?): String? {
+    return Test(
+        if (param == null) {
+           Test(
+                if (param == null) {
+                    remember { "" }
+                } else {
+                    null
+                }
+           )
+        } else {
+            null
+        },
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(param: String?, %composer: Composer?, %changed: Int): String? {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Test(>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = Test(<block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<Test(>")
+    val tmp2_group = if (param == null) {
+      Test(<block>{
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<rememb...>")
+        val tmp1_group = if (param == null) {
+          remember({
+            ""
+          }, %composer, 0)
+        } else {
+          null
+        }
+        %composer.endReplaceableGroup()
+        tmp1_group
+      }, %composer, 0)
+    } else {
+      null
+    }
+    %composer.endReplaceableGroup()
+    tmp2_group
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRepeatedCallsToEffects\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRepeatedCallsToEffects\133useFir = false\135.txt"
new file mode 100644
index 0000000..e3f76dc
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRepeatedCallsToEffects\133useFir = false\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+    Wrap {
+        repeat(number) {
+            effects[it] = effect { 0 }
+        }
+        outside = effect { "0" }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Wrap>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Wrap(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<effect>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "*<effect>")
+      repeat(number) { it: Int ->
+        effects[it] = effect({
+          0
+        }, %composer, 0b0110)
+      }
+      %composer.endReplaceableGroup()
+      outside = effect({
+        "0"
+      }, %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRepeatedCallsToEffects\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRepeatedCallsToEffects\133useFir = true\135.txt"
new file mode 100644
index 0000000..e3f76dc
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testRepeatedCallsToEffects\133useFir = true\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+    Wrap {
+        repeat(number) {
+            effects[it] = effect { 0 }
+        }
+        outside = effect { "0" }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Wrap>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Wrap(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<effect>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "*<effect>")
+      repeat(number) { it: Int ->
+        effects[it] = effect({
+          0
+        }, %composer, 0b0110)
+      }
+      %composer.endReplaceableGroup()
+      outside = effect({
+        "0"
+      }, %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnCallValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnCallValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..5fe2a78
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnCallValue\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(): Int {
+    // since the return expression is a composable call, we need to generate a
+    // temporary variable and then return it after ending the open groups.
+    A()
+    return R()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>,<R()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(%composer, 0)
+  val tmp0 = R(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnCallValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnCallValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..5fe2a78
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnCallValue\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(): Int {
+    // since the return expression is a composable call, we need to generate a
+    // temporary variable and then return it after ending the open groups.
+    A()
+    return R()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>,<R()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(%composer, 0)
+  val tmp0 = R(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnFromLoop\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnFromLoop\133useFir = false\135.txt"
new file mode 100644
index 0000000..5219109
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnFromLoop\133useFir = false\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        val j = i
+        val k = i
+        val l = i
+        P(i)
+        if (i == 0) {
+            P(j)
+            return
+        } else {
+            P(k)
+        }
+        P(l)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>,<P(l)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    val j = i
+    val k = i
+    val l = i
+    P(i, %composer, 0)
+    if (i == 0) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<P(j)>")
+      P(j, %composer, 0)
+      %composer.endReplaceableGroup()
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+      return
+    } else {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<P(k)>")
+      P(k, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    P(l, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnFromLoop\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnFromLoop\133useFir = true\135.txt"
new file mode 100644
index 0000000..5219109
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnFromLoop\133useFir = true\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: Iterator<Int>) {
+    while (items.hasNext()) {
+        val i = items.next()
+        val j = i
+        val k = i
+        val l = i
+        P(i)
+        if (i == 0) {
+            P(j)
+            return
+        } else {
+            P(k)
+        }
+        P(l)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(i)>,<P(l)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.hasNext()) {
+    val i = items.next()
+    val j = i
+    val k = i
+    val l = i
+    P(i, %composer, 0)
+    if (i == 0) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<P(j)>")
+      P(j, %composer, 0)
+      %composer.endReplaceableGroup()
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+      return
+    } else {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<P(k)>")
+      P(k, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    P(l, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnInlinedExpressionWithCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnInlinedExpressionWithCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..4baf241
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnInlinedExpressionWithCall\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.State
+
+@Composable
+fun Test(x: Int): Int {
+    return x.let {
+        A()
+        123
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = <block>{
+    val tmp1_group = x.let { it: Int ->
+      A(%composer, 0)
+      val tmp0_return = 123
+      tmp0_return
+    }
+    tmp1_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnInlinedExpressionWithCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnInlinedExpressionWithCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..4baf241
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testReturnInlinedExpressionWithCall\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.State
+
+@Composable
+fun Test(x: Int): Int {
+    return x.let {
+        A()
+        123
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = <block>{
+    val tmp1_group = x.let { it: Int ->
+      A(%composer, 0)
+      val tmp0_return = 123
+      tmp0_return
+    }
+    tmp1_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSafeCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSafeCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..03e0ce1e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSafeCall\133useFir = false\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int?) {
+    // The composable call is made conditionally, which means it is like an if with
+    // only one result having a composable call, so we just generate a single group
+    // around the whole expression.
+    x?.A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int?, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  x?.A(%composer, 0b1110 and %changed)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSafeCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSafeCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..03e0ce1e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSafeCall\133useFir = true\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int?) {
+    // The composable call is made conditionally, which means it is like an if with
+    // only one result having a composable call, so we just generate a single group
+    // around the whole expression.
+    x?.A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int?, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  x?.A(%composer, 0b1110 and %changed)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceInformationWithPackageName\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceInformationWithPackageName\133useFir = false\135.txt"
new file mode 100644
index 0000000..805e55c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceInformationWithPackageName\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+package androidx.compose.runtime.tests
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(value: LocalInlineClass) {
+    used(value)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(value: LocalInlineClass, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(0:c#runtime.tests.LocalInlineClass):Test.kt#992ot2")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(value))) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, "androidx.compose.runtime.tests.Test (Test.kt:6)")
+    }
+    used(value)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceInformationWithPackageName\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceInformationWithPackageName\133useFir = true\135.txt"
new file mode 100644
index 0000000..805e55c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceInformationWithPackageName\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+package androidx.compose.runtime.tests
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(value: LocalInlineClass) {
+    used(value)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(value: LocalInlineClass, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(0:c#runtime.tests.LocalInlineClass):Test.kt#992ot2")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(value))) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, "androidx.compose.runtime.tests.Test (Test.kt:6)")
+    }
+    used(value)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLineInformationForNormalInline\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLineInformationForNormalInline\133useFir = false\135.txt"
new file mode 100644
index 0000000..7cea7c6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLineInformationForNormalInline\133useFir = false\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+  W {
+    IW {
+        T(2)
+        repeat(3) {
+            T(3)
+        }
+        T(4)
+    }
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<W>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "Test (Test.kt:4)")
+    }
+    W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<IW>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, "ComposableSingletons%TestKt.lambda-1.<anonymous> (Test.kt:6)")
+      }
+      IW({ %composer: Composer?, %changed: Int ->
+        sourceInformationMarkerStart(%composer, <>, "C<T(2)>,<T(4)>:Test.kt")
+        T(2, %composer, 0b0110)
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "*<T(3)>")
+        repeat(3) { it: Int ->
+          T(3, %composer, 0b0110)
+        }
+        %composer.endReplaceableGroup()
+        T(4, %composer, 0b0110)
+        sourceInformationMarkerEnd(%composer)
+      }, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLineInformationForNormalInline\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLineInformationForNormalInline\133useFir = true\135.txt"
new file mode 100644
index 0000000..7cea7c6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLineInformationForNormalInline\133useFir = true\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+  W {
+    IW {
+        T(2)
+        repeat(3) {
+            T(3)
+        }
+        T(4)
+    }
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<W>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "Test (Test.kt:4)")
+    }
+    W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<IW>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, "ComposableSingletons%TestKt.lambda-1.<anonymous> (Test.kt:6)")
+      }
+      IW({ %composer: Composer?, %changed: Int ->
+        sourceInformationMarkerStart(%composer, <>, "C<T(2)>,<T(4)>:Test.kt")
+        T(2, %composer, 0b0110)
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "*<T(3)>")
+        repeat(3) { it: Int ->
+          T(3, %composer, 0b0110)
+        }
+        %composer.endReplaceableGroup()
+        T(4, %composer, 0b0110)
+        sourceInformationMarkerEnd(%composer)
+      }, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLocationOfCapturingComposableLambdas\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLocationOfCapturingComposableLambdas\133useFir = false\135.txt"
new file mode 100644
index 0000000..a43f469
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLocationOfCapturingComposableLambdas\133useFir = false\135.txt"
@@ -0,0 +1,70 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class SomeClass {
+    var a = "Test"
+    fun onCreate() {
+        setContent {
+            B(a)
+            B(a)
+        }
+    }
+}
+
+fun Test() {
+    var a = "Test"
+    setContent {
+        B(a)
+        B(a)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class SomeClass {
+  var a: String = "Test"
+  fun onCreate() {
+    setContent(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<B(a)>,<B(a)>:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, "SomeClass.onCreate.<anonymous> (Test.kt:7)")
+        }
+        B(a, %composer, 0)
+        B(a, %composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    )
+  }
+  static val %stable: Int = 8
+}
+fun Test() {
+  var a = "Test"
+  setContent(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<B(a)>,<B(a)>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, "Test.<anonymous> (Test.kt:16)")
+      }
+      B(a, %composer, 0)
+      B(a, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  )
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLocationOfCapturingComposableLambdas\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLocationOfCapturingComposableLambdas\133useFir = true\135.txt"
new file mode 100644
index 0000000..a43f469
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceLocationOfCapturingComposableLambdas\133useFir = true\135.txt"
@@ -0,0 +1,70 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class SomeClass {
+    var a = "Test"
+    fun onCreate() {
+        setContent {
+            B(a)
+            B(a)
+        }
+    }
+}
+
+fun Test() {
+    var a = "Test"
+    setContent {
+        B(a)
+        B(a)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class SomeClass {
+  var a: String = "Test"
+  fun onCreate() {
+    setContent(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<B(a)>,<B(a)>:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, "SomeClass.onCreate.<anonymous> (Test.kt:7)")
+        }
+        B(a, %composer, 0)
+        B(a, %composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    )
+  }
+  static val %stable: Int = 8
+}
+fun Test() {
+  var a = "Test"
+  setContent(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<B(a)>,<B(a)>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, "Test.<anonymous> (Test.kt:16)")
+      }
+      B(a, %composer, 0)
+      B(a, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  )
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceOffsetOrderForParameterExpressions\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceOffsetOrderForParameterExpressions\133useFir = false\135.txt"
new file mode 100644
index 0000000..8ce2a7d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceOffsetOrderForParameterExpressions\133useFir = false\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+    A(b(), c(), d())
+    B()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<b()>,<c()>,<d()>,<A(b(),>,<B()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "Test (Test.kt:4)")
+    }
+    A(b(%composer, 0), c(%composer, 0), d(%composer, 0), %composer, 0)
+    B(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceOffsetOrderForParameterExpressions\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceOffsetOrderForParameterExpressions\133useFir = true\135.txt"
new file mode 100644
index 0000000..8ce2a7d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testSourceOffsetOrderForParameterExpressions\133useFir = true\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+    A(b(), c(), d())
+    B()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<b()>,<c()>,<d()>,<A(b(),>,<B()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, "Test (Test.kt:4)")
+    }
+    A(b(%composer, 0), c(%composer, 0), d(%composer, 0), %composer, 0)
+    B(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testTheThing\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testTheThing\133useFir = false\135.txt"
new file mode 100644
index 0000000..6627f87
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testTheThing\133useFir = false\135.txt"
@@ -0,0 +1,135 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Simple() {
+  // this has a composable call in it, and since we don't know the number of times the
+  // lambda will get called, we place a group around the whole call
+  run {
+    A()
+  }
+  A()
+}
+
+@NonRestartableComposable
+@Composable
+fun WithReturn() {
+  // this has an early return in it, so it needs to end all of the groups present.
+  run {
+    A()
+    return@WithReturn
+  }
+  A()
+}
+
+@NonRestartableComposable
+@Composable
+fun NoCalls() {
+  // this has no composable calls in it, so shouldn't cause any groups to get created
+  run {
+    println("hello world")
+  }
+  A()
+}
+
+@NonRestartableComposable
+@Composable
+fun NoCallsAfter() {
+  // this has a composable call in the lambda, but not after it, which means the
+  // group should be able to be coalesced into the group of the function
+  run {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Simple(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Simple)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<A()>")
+  run {
+    A(%composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun WithReturn(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(WithReturn)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<A()>")
+  run {
+    A(%composer, 0)
+    %composer.endReplaceableGroup()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun NoCalls(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(NoCalls)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  run {
+    println("hello world")
+  }
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun NoCallsAfter(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(NoCallsAfter)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  run {
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testTheThing\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testTheThing\133useFir = true\135.txt"
new file mode 100644
index 0000000..6627f87
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testTheThing\133useFir = true\135.txt"
@@ -0,0 +1,135 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Simple() {
+  // this has a composable call in it, and since we don't know the number of times the
+  // lambda will get called, we place a group around the whole call
+  run {
+    A()
+  }
+  A()
+}
+
+@NonRestartableComposable
+@Composable
+fun WithReturn() {
+  // this has an early return in it, so it needs to end all of the groups present.
+  run {
+    A()
+    return@WithReturn
+  }
+  A()
+}
+
+@NonRestartableComposable
+@Composable
+fun NoCalls() {
+  // this has no composable calls in it, so shouldn't cause any groups to get created
+  run {
+    println("hello world")
+  }
+  A()
+}
+
+@NonRestartableComposable
+@Composable
+fun NoCallsAfter() {
+  // this has a composable call in the lambda, but not after it, which means the
+  // group should be able to be coalesced into the group of the function
+  run {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Simple(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Simple)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<A()>")
+  run {
+    A(%composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun WithReturn(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(WithReturn)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<A()>")
+  run {
+    A(%composer, 0)
+    %composer.endReplaceableGroup()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    return
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun NoCalls(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(NoCalls)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  run {
+    println("hello world")
+  }
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@NonRestartableComposable
+@Composable
+fun NoCallsAfter(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(NoCallsAfter)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  run {
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..cac30e4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    Text("Some text")
+    Identity {
+        if (condition) return@Test
+    }
+    Text("Some more text")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<Text("...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Some text", %composer, 0b0110)
+    Identity {
+      if (condition) {
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+    }
+    Text("Some more text", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..cac30e4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    Text("Some text")
+    Identity {
+        if (condition) return@Test
+    }
+    Text("Some more text")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<Text("...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Some text", %composer, 0b0110)
+    Identity {
+      if (condition) {
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+    }
+    Text("Some more text", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1\133useFir = false\135.txt"
new file mode 100644
index 0000000..30c84a6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1\133useFir = false\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    Text("Some text")
+    M1 {
+        Identity {
+            if (condition) return@Test
+        }
+    }
+    Text("Some more text")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<M1>,<Text("...>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Some text", %composer, 0b0110)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C:Test.kt")
+      Identity {
+        if (condition) {
+          %composer.endToMarker(tmp0_marker)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+          return
+        }
+      }
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("Some more text", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1\133useFir = true\135.txt"
new file mode 100644
index 0000000..30c84a6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1\133useFir = true\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    Text("Some text")
+    M1 {
+        Identity {
+            if (condition) return@Test
+        }
+    }
+    Text("Some more text")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<M1>,<Text("...>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Some text", %composer, 0b0110)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C:Test.kt")
+      Identity {
+        if (condition) {
+          %composer.endToMarker(tmp0_marker)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+          return
+        }
+      }
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("Some more text", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1_RM1\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1_RM1\133useFir = false\135.txt"
new file mode 100644
index 0000000..dbbe1f9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1_RM1\133useFir = false\135.txt"
@@ -0,0 +1,56 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    Text("Some text")
+    M1 {
+        Identity {
+            if (condition) return@M1
+        }
+    }
+    Text("Some more text")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<M1>,<Text("...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Some text", %composer, 0b0110)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C:Test.kt")
+      Identity {
+        if (condition) {
+          %composer.endReplaceableGroup()
+          return@M1
+        }
+      }
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("Some more text", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1_RM1\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1_RM1\133useFir = true\135.txt"
new file mode 100644
index 0000000..dbbe1f9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testVerifyEarlyExitFromNonComposable_M1_RM1\133useFir = true\135.txt"
@@ -0,0 +1,56 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(condition: Boolean) {
+    Text("Some text")
+    M1 {
+        Identity {
+            if (condition) return@M1
+        }
+    }
+    Text("Some more text")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<M1>,<Text("...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Some text", %composer, 0b0110)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C:Test.kt")
+      Identity {
+        if (condition) {
+          %composer.endReplaceableGroup()
+          return@M1
+        }
+      }
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("Some more text", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..29ae4df
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = false\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // composable calls are in the condition blocks of the when statement. Since these
+    // are conditionally executed, we can't statically know the number of groups during
+    // execution. as a result, we must wrap the when clause with a group.
+    when {
+        x == R(a) -> NA()
+        x > R(b) -> NA()
+        else -> NA()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "")
+  when {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<R(a)>")
+    val tmp0_group = x == R(a, %composer, 0)
+    %composer.endReplaceableGroup()
+    tmp0_group -> {
+      NA()
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<R(b)>")
+    val tmp1_group = x > R(b, %composer, 0)
+    %composer.endReplaceableGroup()
+    tmp1_group -> {
+      NA()
+    }
+    else -> {
+      NA()
+    }
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..29ae4df
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditionsAndCallAfter\133useFir = true\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // composable calls are in the condition blocks of the when statement. Since these
+    // are conditionally executed, we can't statically know the number of groups during
+    // execution. as a result, we must wrap the when clause with a group.
+    when {
+        x == R(a) -> NA()
+        x > R(b) -> NA()
+        else -> NA()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "")
+  when {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<R(a)>")
+    val tmp0_group = x == R(a, %composer, 0)
+    %composer.endReplaceableGroup()
+    tmp0_group -> {
+      NA()
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<R(b)>")
+    val tmp1_group = x > R(b, %composer, 0)
+    %composer.endReplaceableGroup()
+    tmp1_group -> {
+      NA()
+    }
+    else -> {
+      NA()
+    }
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = false\135.txt"
new file mode 100644
index 0000000..e1c01ea
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = false\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // composable calls are in the condition blocks of the when statement. Since these
+    // are conditionally executed, we can't statically know the number of groups during
+    // execution. as a result, we must wrap the when clause with a group. Since there
+    // are no other composable calls, the function body group will suffice.
+    when {
+        x == R(a) -> NA()
+        x > R(b) -> NA()
+        else -> NA()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  when {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<R(a)>")
+    val tmp0_group = x == R(a, %composer, 0)
+    %composer.endReplaceableGroup()
+    tmp0_group -> {
+      NA()
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<R(b)>")
+    val tmp1_group = x > R(b, %composer, 0)
+    %composer.endReplaceableGroup()
+    tmp1_group -> {
+      NA()
+    }
+    else -> {
+      NA()
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = true\135.txt"
new file mode 100644
index 0000000..e1c01ea
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInConditions\133useFir = true\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // composable calls are in the condition blocks of the when statement. Since these
+    // are conditionally executed, we can't statically know the number of groups during
+    // execution. as a result, we must wrap the when clause with a group. Since there
+    // are no other composable calls, the function body group will suffice.
+    when {
+        x == R(a) -> NA()
+        x > R(b) -> NA()
+        else -> NA()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  when {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<R(a)>")
+    val tmp0_group = x == R(a, %composer, 0)
+    %composer.endReplaceableGroup()
+    tmp0_group -> {
+      NA()
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<R(b)>")
+    val tmp1_group = x > R(b, %composer, 0)
+    %composer.endReplaceableGroup()
+    tmp1_group -> {
+      NA()
+    }
+    else -> {
+      NA()
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInSomeResults\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInSomeResults\133useFir = false\135.txt"
new file mode 100644
index 0000000..26d3c7b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInSomeResults\133useFir = false\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // result blocks have composable calls, so we generate groups round them. It's a
+    // statically guaranteed number of groups at execution, so no wrapping group is
+    // needed.
+    when {
+        x < 0 -> A(a)
+        x > 30 -> NA()
+        else -> A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  when {
+    x < 0 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(a)>")
+      A(a, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    x > 30 -> {
+      %composer.startReplaceableGroup(<>)
+      %composer.endReplaceableGroup()
+      NA()
+    }
+    else -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(b)>")
+      A(b, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInSomeResults\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInSomeResults\133useFir = true\135.txt"
new file mode 100644
index 0000000..26d3c7b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCallsInSomeResults\133useFir = true\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // result blocks have composable calls, so we generate groups round them. It's a
+    // statically guaranteed number of groups at execution, so no wrapping group is
+    // needed.
+    when {
+        x < 0 -> A(a)
+        x > 30 -> NA()
+        else -> A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  when {
+    x < 0 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(a)>")
+      A(a, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    x > 30 -> {
+      %composer.startReplaceableGroup(<>)
+      %composer.endReplaceableGroup()
+      NA()
+    }
+    else -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(b)>")
+      A(b, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCalls\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCalls\133useFir = false\135.txt"
new file mode 100644
index 0000000..b5656eb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCalls\133useFir = false\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // result blocks have composable calls, so we generate groups round them. It's a
+    // statically guaranteed number of groups at execution, so no wrapping group is
+    // needed.
+    when {
+        x < 0 -> A(a)
+        x > 30 -> A(b)
+        else -> A(c)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  when {
+    x < 0 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(a)>")
+      A(a, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    x > 30 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(b)>")
+      A(b, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    else -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(c)>")
+      A(c, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCalls\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCalls\133useFir = true\135.txt"
new file mode 100644
index 0000000..b5656eb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithCalls\133useFir = true\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // result blocks have composable calls, so we generate groups round them. It's a
+    // statically guaranteed number of groups at execution, so no wrapping group is
+    // needed.
+    when {
+        x < 0 -> A(a)
+        x > 30 -> A(b)
+        else -> A(c)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  when {
+    x < 0 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(a)>")
+      A(a, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    x > 30 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(b)>")
+      A(b, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    else -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(c)>")
+      A(c, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCallsWithResult\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCallsWithResult\133useFir = false\135.txt"
new file mode 100644
index 0000000..82c50da
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCallsWithResult\133useFir = false\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // no need for a group around the when expression overall, but since the result
+    // of the expression is now being used, we need to generate temporary variables to
+    // capture the result but still do the execution of the expression inside of groups.
+    val y = when (x) {
+        0 -> R(a)
+        1 -> R(b)
+        else -> R(c)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val y = <block>{
+    val tmp0_subject = x
+    when {
+      tmp0_subject == 0 -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<R(a)>")
+        val tmp0_group = R(a, %composer, 0)
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+      tmp0_subject == 0b0001 -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<R(b)>")
+        val tmp1_group = R(b, %composer, 0)
+        %composer.endReplaceableGroup()
+        tmp1_group
+      }
+      else -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<R(c)>")
+        val tmp2_group = R(c, %composer, 0)
+        %composer.endReplaceableGroup()
+        tmp2_group
+      }
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCallsWithResult\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCallsWithResult\133useFir = true\135.txt"
new file mode 100644
index 0000000..82c50da
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCallsWithResult\133useFir = true\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // no need for a group around the when expression overall, but since the result
+    // of the expression is now being used, we need to generate temporary variables to
+    // capture the result but still do the execution of the expression inside of groups.
+    val y = when (x) {
+        0 -> R(a)
+        1 -> R(b)
+        else -> R(c)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val y = <block>{
+    val tmp0_subject = x
+    when {
+      tmp0_subject == 0 -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<R(a)>")
+        val tmp0_group = R(a, %composer, 0)
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+      tmp0_subject == 0b0001 -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<R(b)>")
+        val tmp1_group = R(b, %composer, 0)
+        %composer.endReplaceableGroup()
+        tmp1_group
+      }
+      else -> {
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "<R(c)>")
+        val tmp2_group = R(c, %composer, 0)
+        %composer.endReplaceableGroup()
+        tmp2_group
+      }
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCalls\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCalls\133useFir = false\135.txt"
new file mode 100644
index 0000000..68d1ac4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCalls\133useFir = false\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // calls only in the result block, which means we can statically guarantee the
+    // number of groups, so no group around the when is needed, just groups around the
+    // result blocks.
+    when (x) {
+        0 -> A(a)
+        1 -> A(b)
+        else -> A(c)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0_subject = x
+  when {
+    tmp0_subject == 0 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(a)>")
+      A(a, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    tmp0_subject == 0b0001 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(b)>")
+      A(b, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    else -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(c)>")
+      A(c, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCalls\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCalls\133useFir = true\135.txt"
new file mode 100644
index 0000000..68d1ac4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndCalls\133useFir = true\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // calls only in the result block, which means we can statically guarantee the
+    // number of groups, so no group around the when is needed, just groups around the
+    // result blocks.
+    when (x) {
+        0 -> A(a)
+        1 -> A(b)
+        else -> A(c)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0_subject = x
+  when {
+    tmp0_subject == 0 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(a)>")
+      A(a, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    tmp0_subject == 0b0001 -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(b)>")
+      A(b, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+    else -> {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<A(c)>")
+      A(c, %composer, 0)
+      %composer.endReplaceableGroup()
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndNoCalls\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndNoCalls\133useFir = false\135.txt"
new file mode 100644
index 0000000..bf646b0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndNoCalls\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // nothing needed except for the function boundary group
+    when (x) {
+        0 -> 8
+        1 -> 10
+        else -> x
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0_subject = x
+  when {
+    tmp0_subject == 0 -> {
+      8
+    }
+    tmp0_subject == 0b0001 -> {
+      10
+    }
+    else -> {
+      x
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndNoCalls\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndNoCalls\133useFir = true\135.txt"
new file mode 100644
index 0000000..bf646b0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhenWithSubjectAndNoCalls\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    // nothing needed except for the function boundary group
+    when (x) {
+        0 -> 8
+        1 -> 10
+        else -> x
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0_subject = x
+  when {
+    tmp0_subject == 0 -> {
+      8
+    }
+    tmp0_subject == 0b0001 -> {
+      10
+    }
+    else -> {
+      x
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..5bd1970
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallAfter\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        while (x > 0) {
+            A()
+        }
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A()>")
+    while (x > 0) {
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..5bd1970
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallAfter\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        while (x > 0) {
+            A()
+        }
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<A()>")
+    while (x > 0) {
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallBefore\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallBefore\133useFir = false\135.txt"
new file mode 100644
index 0000000..3479e9e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallBefore\133useFir = false\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        A()
+        while (x > 0) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>,*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(%composer, 0)
+    while (x > 0) {
+      A(%composer, 0)
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallBefore\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallBefore\133useFir = true\135.txt"
new file mode 100644
index 0000000..3479e9e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIfAndCallBefore\133useFir = true\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        A()
+        while (x > 0) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>,*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    A(%composer, 0)
+    while (x > 0) {
+      A(%composer, 0)
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIf\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIf\133useFir = false\135.txt"
new file mode 100644
index 0000000..6c9106d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIf\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        while (x > 0) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    while (x > 0) {
+      A(%composer, 0)
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIf\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIf\133useFir = true\135.txt"
new file mode 100644
index 0000000..6c9106d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileInsideIf\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    if (x > 0) {
+        while (x > 0) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (x > 0) {
+    while (x > 0) {
+      A(%composer, 0)
+    }
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBodyAndCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBodyAndCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..b1bac84
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBodyAndCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: MutableList<Int>) {
+    // since we have a composable call which is called a conditional number of times,
+    // we need to generate groups around the loop's block as well as a group around the
+    // overall statement.
+    while (items.isNotEmpty()) {
+        val item = items.removeAt(items.size - 1)
+        P(item)
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: MutableList<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<P(item...>")
+  while (items.isNotEmpty()) {
+    val item = items.removeAt(items.size - 1)
+    P(item, %composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBodyAndCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBodyAndCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..b1bac84
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBodyAndCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: MutableList<Int>) {
+    // since we have a composable call which is called a conditional number of times,
+    // we need to generate groups around the loop's block as well as a group around the
+    // overall statement.
+    while (items.isNotEmpty()) {
+        val item = items.removeAt(items.size - 1)
+        P(item)
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: MutableList<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<P(item...>")
+  while (items.isNotEmpty()) {
+    val item = items.removeAt(items.size - 1)
+    P(item, %composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBody\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBody\133useFir = false\135.txt"
new file mode 100644
index 0000000..403cb64
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBody\133useFir = false\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: MutableList<Int>) {
+    // since we have a composable call which is called a conditional number of times,
+    // we need to generate groups around the loop's block as well as a group around the
+    // overall statement. Since there are no calls after the while loop, the function
+    // body group will suffice.
+    while (items.isNotEmpty()) {
+        val item = items.removeAt(items.size - 1)
+        P(item)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: MutableList<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(item...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.isNotEmpty()) {
+    val item = items.removeAt(items.size - 1)
+    P(item, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBody\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBody\133useFir = true\135.txt"
new file mode 100644
index 0000000..403cb64
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInBody\133useFir = true\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(items: MutableList<Int>) {
+    // since we have a composable call which is called a conditional number of times,
+    // we need to generate groups around the loop's block as well as a group around the
+    // overall statement. Since there are no calls after the while loop, the function
+    // body group will suffice.
+    while (items.isNotEmpty()) {
+        val item = items.removeAt(items.size - 1)
+        P(item)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(items: MutableList<Int>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<P(item...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (items.isNotEmpty()) {
+    val item = items.removeAt(items.size - 1)
+    P(item, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBodyAndCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBodyAndCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..4ac791b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBodyAndCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // Both the condition and the body of the loop get groups because they have
+    // composable calls in them. We must generate a group around the while statement
+    // overall.
+    while (B()) {
+        A(a)
+    }
+    A(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<B()>,<A(a)>")
+  while (B(%composer, 0)) {
+    A(a, %composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(b, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBodyAndCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBodyAndCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..4ac791b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBodyAndCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // Both the condition and the body of the loop get groups because they have
+    // composable calls in them. We must generate a group around the while statement
+    // overall.
+    while (B()) {
+        A(a)
+    }
+    A(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<B()>,<A(a)>")
+  while (B(%composer, 0)) {
+    A(a, %composer, 0)
+  }
+  %composer.endReplaceableGroup()
+  A(b, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBody\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBody\133useFir = false\135.txt"
new file mode 100644
index 0000000..697f903
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBody\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // Both the condition and the body of the loop get groups because they have
+    // composable calls in them. We must generate a group around the while statement
+    // overall, but the function body group will suffice.
+    while (B()) {
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<B()>,<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (B(%composer, 0)) {
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBody\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBody\133useFir = true\135.txt"
new file mode 100644
index 0000000..697f903
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndBody\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // Both the condition and the body of the loop get groups because they have
+    // composable calls in them. We must generate a group around the while statement
+    // overall, but the function body group will suffice.
+    while (B()) {
+        A()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<B()>,<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (B(%composer, 0)) {
+    A(%composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..6c93a81
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // A while loop's condition block gets executed a conditional number of times, so
+    // so we must generate a group around the while expression overall.
+    while (B()) {
+        print("hello world")
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<B()>")
+  while (B(%composer, 0)) {
+    print("hello world")
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..6c93a81
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInConditionAndCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // A while loop's condition block gets executed a conditional number of times, so
+    // so we must generate a group around the while expression overall.
+    while (B()) {
+        print("hello world")
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "*<B()>")
+  while (B(%composer, 0)) {
+    print("hello world")
+  }
+  %composer.endReplaceableGroup()
+  A(%composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInCondition\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInCondition\133useFir = false\135.txt"
new file mode 100644
index 0000000..0c8889e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInCondition\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // A while loop's condition block gets executed a conditional number of times, so
+    // so we must generate a group around the while expression overall. The function
+    // body group will suffice.
+    while (B()) {
+        print("hello world")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<B()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (B(%composer, 0)) {
+    print("hello world")
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInCondition\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInCondition\133useFir = true\135.txt"
new file mode 100644
index 0000000..0c8889e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileLoopWithCallsInCondition\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example() {
+    // A while loop's condition block gets executed a conditional number of times, so
+    // so we must generate a group around the while expression overall. The function
+    // body group will suffice.
+    while (B()) {
+        print("hello world")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<B()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (B(%composer, 0)) {
+    print("hello world")
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..40c58df
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallAfter\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        key(x) {
+            A(a)
+        }
+        A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A(b)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(a)>")
+    A(a, %composer, 0)
+    %composer.endMovableGroup()
+    A(b, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..40c58df
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallAfter\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        key(x) {
+            A(a)
+        }
+        A(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A(b)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(a)>")
+    A(a, %composer, 0)
+    %composer.endMovableGroup()
+    A(b, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBeforeAndAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBeforeAndAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..d91a877
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBeforeAndAfter\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        A(a)
+        key(x) {
+            A(b)
+        }
+        A(c)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A(a)>,<A(c)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    A(a, %composer, 0)
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endMovableGroup()
+    A(c, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBeforeAndAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBeforeAndAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..d91a877
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBeforeAndAfter\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        A(a)
+        key(x) {
+            A(b)
+        }
+        A(c)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A(a)>,<A(c)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    A(a, %composer, 0)
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endMovableGroup()
+    A(c, %composer, 0)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBefore\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBefore\133useFir = false\135.txt"
new file mode 100644
index 0000000..d181f75
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBefore\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        A(a)
+        key(x) {
+            A(b)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A(a)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    A(a, %composer, 0)
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBefore\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBefore\133useFir = true\135.txt"
new file mode 100644
index 0000000..d181f75
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKeyAndCallBefore\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        A(a)
+        key(x) {
+            A(b)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)*<A(a)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    A(a, %composer, 0)
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKey\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKey\133useFir = false\135.txt"
new file mode 100644
index 0000000..523348e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKey\133useFir = false\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        key(x) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A()>")
+    A(%composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKey\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKey\133useFir = true\135.txt"
new file mode 100644
index 0000000..523348e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithKey\133useFir = true\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        key(x) {
+            A()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A()>")
+    A(%composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithTwoKeys\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithTwoKeys\133useFir = false\135.txt"
new file mode 100644
index 0000000..1fcd79d1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithTwoKeys\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        key(x) {
+            A(a)
+        }
+        key(x+1) {
+            A(b)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(a)>")
+    A(a, %composer, 0)
+    %composer.endMovableGroup()
+    %composer.startMovableGroup(<>, x + 1)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithTwoKeys\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithTwoKeys\133useFir = true\135.txt"
new file mode 100644
index 0000000..1fcd79d1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/testWhileWithTwoKeys\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable @Composable
+fun Example(x: Int) {
+    while (x > 0) {
+        key(x) {
+            A(a)
+        }
+        key(x+1) {
+            A(b)
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  while (x > 0) {
+    %composer.startMovableGroup(<>, x)
+    sourceInformation(%composer, "<A(a)>")
+    A(a, %composer, 0)
+    %composer.endMovableGroup()
+    %composer.startMovableGroup(<>, x + 1)
+    sourceInformation(%composer, "<A(b)>")
+    A(b, %composer, 0)
+    %composer.endMovableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/test_CM1_CCM1_RetFun\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/test_CM1_CCM1_RetFun\133useFir = false\135.txt"
new file mode 100644
index 0000000..3c72d6c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/test_CM1_CCM1_RetFun\133useFir = false\135.txt"
@@ -0,0 +1,79 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun test_CM1_CCM1_RetFun(condition: Boolean) {
+    Text("Root - before")
+    M1 {
+        Text("M1 - begin")
+        if (condition) {
+            Text("if - begin")
+            M1 {
+                Text("In CCM1")
+                return@test_CM1_CCM1_RetFun
+            }
+        }
+        Text("M1 - end")
+    }
+    Text("Root - end")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun test_CM1_CCM1_RetFun(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test_CM1_CCM1_RetFun)<Text("...>,<M1>,<Text("...>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Root - before", %composer, 0b0110)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
+      Text("M1 - begin", %composer, 0b0110)
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<Text("...>,<M1>")
+      if (condition) {
+        Text("if - begin", %composer, 0b0110)
+        M1({ %composer: Composer?, %changed: Int ->
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C<Text("...>:Test.kt")
+          Text("In CCM1", %composer, 0b0110)
+          %composer.endToMarker(tmp0_marker)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+          %composer@test_CM1_CCM1_RetFun.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            test_CM1_CCM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+          return
+          %composer.endReplaceableGroup()
+        }, %composer, 0)
+      }
+      %composer.endReplaceableGroup()
+      Text("M1 - end", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("Root - end", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test_CM1_CCM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/test_CM1_CCM1_RetFun\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/test_CM1_CCM1_RetFun\133useFir = true\135.txt"
new file mode 100644
index 0000000..3c72d6c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/test_CM1_CCM1_RetFun\133useFir = true\135.txt"
@@ -0,0 +1,79 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun test_CM1_CCM1_RetFun(condition: Boolean) {
+    Text("Root - before")
+    M1 {
+        Text("M1 - begin")
+        if (condition) {
+            Text("if - begin")
+            M1 {
+                Text("In CCM1")
+                return@test_CM1_CCM1_RetFun
+            }
+        }
+        Text("M1 - end")
+    }
+    Text("Root - end")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun test_CM1_CCM1_RetFun(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test_CM1_CCM1_RetFun)<Text("...>,<M1>,<Text("...>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Root - before", %composer, 0b0110)
+    M1({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
+      Text("M1 - begin", %composer, 0b0110)
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "<Text("...>,<M1>")
+      if (condition) {
+        Text("if - begin", %composer, 0b0110)
+        M1({ %composer: Composer?, %changed: Int ->
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C<Text("...>:Test.kt")
+          Text("In CCM1", %composer, 0b0110)
+          %composer.endToMarker(tmp0_marker)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+          %composer@test_CM1_CCM1_RetFun.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            test_CM1_CCM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+          return
+          %composer.endReplaceableGroup()
+        }, %composer, 0)
+      }
+      %composer.endReplaceableGroup()
+      Text("M1 - end", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("Root - end", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test_CM1_CCM1_RetFun(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = false\135.txt"
new file mode 100644
index 0000000..f7afbd3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = false\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean) {
+    Text("Before outer")
+    InlineLinearA outer@{
+        Text("Before inner")
+        InlineLinearB {
+            Text("Before return")
+            if (condition) return@outer
+            Text("After return")
+        }
+        Text("After inner")
+    }
+    Text("Before outer")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<Inline...>,<Text("...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Text("Before outer", %composer, 0b0110)
+  InlineLinearA({ %composer: Composer?, %changed: Int ->
+    val tmp0_marker = %composer.currentMarker
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C<Text("...>,<Inline...>,<Text("...>:Test.kt")
+    Text("Before inner", %composer, 0b0110)
+    InlineLinearB({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
+      Text("Before return", %composer, 0b0110)
+      if (condition) {
+        %composer.endToMarker(tmp0_marker)
+        return@InlineLinearA
+      }
+      Text("After return", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("After inner", %composer, 0b0110)
+    %composer.endReplaceableGroup()
+  }, %composer, 0)
+  Text("Before outer", %composer, 0b0110)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = true\135.txt"
new file mode 100644
index 0000000..f7afbd3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = true\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean) {
+    Text("Before outer")
+    InlineLinearA outer@{
+        Text("Before inner")
+        InlineLinearB {
+            Text("Before return")
+            if (condition) return@outer
+            Text("After return")
+        }
+        Text("After inner")
+    }
+    Text("Before outer")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<Inline...>,<Text("...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Text("Before outer", %composer, 0b0110)
+  InlineLinearA({ %composer: Composer?, %changed: Int ->
+    val tmp0_marker = %composer.currentMarker
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C<Text("...>,<Inline...>,<Text("...>:Test.kt")
+    Text("Before inner", %composer, 0b0110)
+    InlineLinearB({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
+      Text("Before return", %composer, 0b0110)
+      if (condition) {
+        %composer.endToMarker(tmp0_marker)
+        return@InlineLinearA
+      }
+      Text("After return", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("After inner", %composer, 0b0110)
+    %composer.endReplaceableGroup()
+  }, %composer, 0)
+  Text("Before outer", %composer, 0b0110)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromNestedInlineFunction\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromNestedInlineFunction\133useFir = false\135.txt"
new file mode 100644
index 0000000..fdeba0f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromNestedInlineFunction\133useFir = false\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean) {
+    Text("Before outer")
+    InlineLinearA {
+        Text("Before inner")
+        InlineLinearB inner@{
+            Text("Before return")
+            if (condition) return@inner
+            Text("After return")
+        }
+        Text("After inner")
+    }
+    Text("Before outer")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<Inline...>,<Text("...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Text("Before outer", %composer, 0b0110)
+  InlineLinearA({ %composer: Composer?, %changed: Int ->
+    sourceInformationMarkerStart(%composer, <>, "C<Text("...>,<Inline...>,<Text("...>:Test.kt")
+    Text("Before inner", %composer, 0b0110)
+    InlineLinearB({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
+      Text("Before return", %composer, 0b0110)
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@InlineLinearB
+      }
+      Text("After return", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("After inner", %composer, 0b0110)
+    sourceInformationMarkerEnd(%composer)
+  }, %composer, 0)
+  Text("Before outer", %composer, 0b0110)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromNestedInlineFunction\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromNestedInlineFunction\133useFir = true\135.txt"
new file mode 100644
index 0000000..fdeba0f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTests/verifyEarlyExitFromNestedInlineFunction\133useFir = true\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean) {
+    Text("Before outer")
+    InlineLinearA {
+        Text("Before inner")
+        InlineLinearB inner@{
+            Text("Before return")
+            if (condition) return@inner
+            Text("After return")
+        }
+        Text("After inner")
+    }
+    Text("Before outer")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>,<Inline...>,<Text("...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Text("Before outer", %composer, 0b0110)
+  InlineLinearA({ %composer: Composer?, %changed: Int ->
+    sourceInformationMarkerStart(%composer, <>, "C<Text("...>,<Inline...>,<Text("...>:Test.kt")
+    Text("Before inner", %composer, 0b0110)
+    InlineLinearB({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<Text("...>,<Text("...>:Test.kt")
+      Text("Before return", %composer, 0b0110)
+      if (condition) {
+        %composer.endReplaceableGroup()
+        return@InlineLinearB
+      }
+      Text("After return", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("After inner", %composer, 0b0110)
+    sourceInformationMarkerEnd(%composer)
+  }, %composer, 0)
+  Text("Before outer", %composer, 0b0110)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAWrapperComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAWrapperComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..5890127
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAWrapperComposable\133useFir = false\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  W {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      A(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAWrapperComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAWrapperComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..5890127
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAWrapperComposable\133useFir = true\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  W {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    W(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      A(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAnInlineWrapperComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAnInlineWrapperComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..98c6e05
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAnInlineWrapperComposable\133useFir = false\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  IW {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    IW({ %composer: Composer?, %changed: Int ->
+      A(%composer, 0)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAnInlineWrapperComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAnInlineWrapperComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..98c6e05
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testCallingAnInlineWrapperComposable\133useFir = true\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  IW {
+    A()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    IW({ %composer: Composer?, %changed: Int ->
+      A(%composer, 0)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPrivateFunctionDoNotGetMarkedAsCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPrivateFunctionDoNotGetMarkedAsCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..2a59759
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPrivateFunctionDoNotGetMarkedAsCall\133useFir = false\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+private fun Test() {
+  A(a)
+  A(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(a, %composer, 0)
+    A(b, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPrivateFunctionDoNotGetMarkedAsCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPrivateFunctionDoNotGetMarkedAsCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..2a59759
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPrivateFunctionDoNotGetMarkedAsCall\133useFir = true\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+private fun Test() {
+  A(a)
+  A(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(a, %composer, 0)
+    A(b, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPublicFunctionAlwaysMarkedAsCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPublicFunctionAlwaysMarkedAsCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..b15aaf87
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPublicFunctionAlwaysMarkedAsCall\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  A(a)
+  A(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(a, %composer, 0)
+    A(b, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPublicFunctionAlwaysMarkedAsCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPublicFunctionAlwaysMarkedAsCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..b15aaf87
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/testPublicFunctionAlwaysMarkedAsCall\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.key
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+  A(a)
+  A(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(a, %composer, 0)
+    A(b, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = false\135.txt"
new file mode 100644
index 0000000..8637fa3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = false\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean) {
+    Text("Before outer")
+    InlineLinearA outer@{
+        Text("Before inner")
+        InlineLinearB {
+            Text("Before return")
+            if (condition) return@outer
+            Text("After return")
+        }
+        Text("After inner")
+    }
+    Text("Before outer")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Text("Before outer", %composer, 0b0110)
+  InlineLinearA({ %composer: Composer?, %changed: Int ->
+    val tmp0_marker = %composer.currentMarker
+    %composer.startReplaceableGroup(<>)
+    Text("Before inner", %composer, 0b0110)
+    InlineLinearB({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      Text("Before return", %composer, 0b0110)
+      if (condition) {
+        %composer.endToMarker(tmp0_marker)
+        return@InlineLinearA
+      }
+      Text("After return", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("After inner", %composer, 0b0110)
+    %composer.endReplaceableGroup()
+  }, %composer, 0)
+  Text("Before outer", %composer, 0b0110)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = true\135.txt"
new file mode 100644
index 0000000..8637fa3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.ControlFlowTransformTestsNoSource/verifyEarlyExitFromMultiLevelNestedInlineFunction\133useFir = true\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean) {
+    Text("Before outer")
+    InlineLinearA outer@{
+        Text("Before inner")
+        InlineLinearB {
+            Text("Before return")
+            if (condition) return@outer
+            Text("After return")
+        }
+        Text("After inner")
+    }
+    Text("Before outer")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Text("Before outer", %composer, 0b0110)
+  InlineLinearA({ %composer: Composer?, %changed: Int ->
+    val tmp0_marker = %composer.currentMarker
+    %composer.startReplaceableGroup(<>)
+    Text("Before inner", %composer, 0b0110)
+    InlineLinearB({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      Text("Before return", %composer, 0b0110)
+      if (condition) {
+        %composer.endToMarker(tmp0_marker)
+        return@InlineLinearA
+      }
+      Text("After return", %composer, 0b0110)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    Text("After inner", %composer, 0b0110)
+    %composer.endReplaceableGroup()
+  }, %composer, 0)
+  Text("Before outer", %composer, 0b0110)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test30Parameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test30Parameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..411b3cf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test30Parameters\133useFir = false\135.txt"
@@ -0,0 +1,380 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Int = 0,
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0,
+    a15: Int = 0,
+    a16: Int = 0,
+    a17: Int = 0,
+    a18: Int = 0,
+    a19: Int = 0,
+    a20: Int = 0,
+    a21: Int = 0,
+    a22: Int = 0,
+    a23: Int = 0,
+    a24: Int = 0,
+    a25: Int = 0,
+    a26: Int = 0,
+    a27: Int = 0,
+    a28: Int = 0,
+    a29: Int = 0,
+    a30: Int = 0
+) {
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  val %dirty2 = %changed2
+  val %dirty3 = %changed3
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b001000000000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000000000000000
+  } else if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b1000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000
+  } else if (%changed1 and 0b01110000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b00010000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000000000000000
+  } else if (%changed1 and 0b001110000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b00100000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000000000000000
+  } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b01000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000000000000000
+  } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b10000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000000000000000
+  } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b000100000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110
+  } else if (%changed2 and 0b1110 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
+  }
+  if (%default and 0b001000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000
+  } else if (%changed2 and 0b01110000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b010000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000
+  } else if (%changed2 and 0b001110000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b100000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000
+  } else if (%changed2 and 0b0001110000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0001000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000
+  } else if (%changed2 and 0b1110000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b0010000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000
+  } else if (%changed2 and 0b01110000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b0100000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000000000000000
+  } else if (%changed2 and 0b001110000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b1000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000000000000000
+  } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b00010000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000000000000000
+  } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b00100000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000000000000000
+  } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b01000000000000000000000000000000 != 0) {
+    %dirty3 = %dirty3 or 0b0110
+  } else if (%changed3 and 0b1110 == 0) {
+    %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a00 = 0
+    }
+    if (%default and 0b0010 != 0) {
+      a01 = 0
+    }
+    if (%default and 0b0100 != 0) {
+      a02 = 0
+    }
+    if (%default and 0b1000 != 0) {
+      a03 = 0
+    }
+    if (%default and 0b00010000 != 0) {
+      a04 = 0
+    }
+    if (%default and 0b00100000 != 0) {
+      a05 = 0
+    }
+    if (%default and 0b01000000 != 0) {
+      a06 = 0
+    }
+    if (%default and 0b10000000 != 0) {
+      a07 = 0
+    }
+    if (%default and 0b000100000000 != 0) {
+      a08 = 0
+    }
+    if (%default and 0b001000000000 != 0) {
+      a09 = 0
+    }
+    if (%default and 0b010000000000 != 0) {
+      a10 = 0
+    }
+    if (%default and 0b100000000000 != 0) {
+      a11 = 0
+    }
+    if (%default and 0b0001000000000000 != 0) {
+      a12 = 0
+    }
+    if (%default and 0b0010000000000000 != 0) {
+      a13 = 0
+    }
+    if (%default and 0b0100000000000000 != 0) {
+      a14 = 0
+    }
+    if (%default and 0b1000000000000000 != 0) {
+      a15 = 0
+    }
+    if (%default and 0b00010000000000000000 != 0) {
+      a16 = 0
+    }
+    if (%default and 0b00100000000000000000 != 0) {
+      a17 = 0
+    }
+    if (%default and 0b01000000000000000000 != 0) {
+      a18 = 0
+    }
+    if (%default and 0b10000000000000000000 != 0) {
+      a19 = 0
+    }
+    if (%default and 0b000100000000000000000000 != 0) {
+      a20 = 0
+    }
+    if (%default and 0b001000000000000000000000 != 0) {
+      a21 = 0
+    }
+    if (%default and 0b010000000000000000000000 != 0) {
+      a22 = 0
+    }
+    if (%default and 0b100000000000000000000000 != 0) {
+      a23 = 0
+    }
+    if (%default and 0b0001000000000000000000000000 != 0) {
+      a24 = 0
+    }
+    if (%default and 0b0010000000000000000000000000 != 0) {
+      a25 = 0
+    }
+    if (%default and 0b0100000000000000000000000000 != 0) {
+      a26 = 0
+    }
+    if (%default and 0b1000000000000000000000000000 != 0) {
+      a27 = 0
+    }
+    if (%default and 0b00010000000000000000000000000000 != 0) {
+      a28 = 0
+    }
+    if (%default and 0b00100000000000000000000000000000 != 0) {
+      a29 = 0
+    }
+    if (%default and 0b01000000000000000000000000000000 != 0) {
+      a30 = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test30Parameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test30Parameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..411b3cf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test30Parameters\133useFir = true\135.txt"
@@ -0,0 +1,380 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Int = 0,
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0,
+    a15: Int = 0,
+    a16: Int = 0,
+    a17: Int = 0,
+    a18: Int = 0,
+    a19: Int = 0,
+    a20: Int = 0,
+    a21: Int = 0,
+    a22: Int = 0,
+    a23: Int = 0,
+    a24: Int = 0,
+    a25: Int = 0,
+    a26: Int = 0,
+    a27: Int = 0,
+    a28: Int = 0,
+    a29: Int = 0,
+    a30: Int = 0
+) {
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  val %dirty2 = %changed2
+  val %dirty3 = %changed3
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b001000000000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000000000000000
+  } else if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b1000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000
+  } else if (%changed1 and 0b01110000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b00010000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000000000000000
+  } else if (%changed1 and 0b001110000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b00100000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000000000000000
+  } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b01000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000000000000000
+  } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b10000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000000000000000
+  } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b000100000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110
+  } else if (%changed2 and 0b1110 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
+  }
+  if (%default and 0b001000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000
+  } else if (%changed2 and 0b01110000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b010000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000
+  } else if (%changed2 and 0b001110000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b100000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000
+  } else if (%changed2 and 0b0001110000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0001000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000
+  } else if (%changed2 and 0b1110000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b0010000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000
+  } else if (%changed2 and 0b01110000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b0100000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000000000000000
+  } else if (%changed2 and 0b001110000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b1000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000000000000000
+  } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b00010000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000000000000000
+  } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b00100000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000000000000000
+  } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b01000000000000000000000000000000 != 0) {
+    %dirty3 = %dirty3 or 0b0110
+  } else if (%changed3 and 0b1110 == 0) {
+    %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a00 = 0
+    }
+    if (%default and 0b0010 != 0) {
+      a01 = 0
+    }
+    if (%default and 0b0100 != 0) {
+      a02 = 0
+    }
+    if (%default and 0b1000 != 0) {
+      a03 = 0
+    }
+    if (%default and 0b00010000 != 0) {
+      a04 = 0
+    }
+    if (%default and 0b00100000 != 0) {
+      a05 = 0
+    }
+    if (%default and 0b01000000 != 0) {
+      a06 = 0
+    }
+    if (%default and 0b10000000 != 0) {
+      a07 = 0
+    }
+    if (%default and 0b000100000000 != 0) {
+      a08 = 0
+    }
+    if (%default and 0b001000000000 != 0) {
+      a09 = 0
+    }
+    if (%default and 0b010000000000 != 0) {
+      a10 = 0
+    }
+    if (%default and 0b100000000000 != 0) {
+      a11 = 0
+    }
+    if (%default and 0b0001000000000000 != 0) {
+      a12 = 0
+    }
+    if (%default and 0b0010000000000000 != 0) {
+      a13 = 0
+    }
+    if (%default and 0b0100000000000000 != 0) {
+      a14 = 0
+    }
+    if (%default and 0b1000000000000000 != 0) {
+      a15 = 0
+    }
+    if (%default and 0b00010000000000000000 != 0) {
+      a16 = 0
+    }
+    if (%default and 0b00100000000000000000 != 0) {
+      a17 = 0
+    }
+    if (%default and 0b01000000000000000000 != 0) {
+      a18 = 0
+    }
+    if (%default and 0b10000000000000000000 != 0) {
+      a19 = 0
+    }
+    if (%default and 0b000100000000000000000000 != 0) {
+      a20 = 0
+    }
+    if (%default and 0b001000000000000000000000 != 0) {
+      a21 = 0
+    }
+    if (%default and 0b010000000000000000000000 != 0) {
+      a22 = 0
+    }
+    if (%default and 0b100000000000000000000000 != 0) {
+      a23 = 0
+    }
+    if (%default and 0b0001000000000000000000000000 != 0) {
+      a24 = 0
+    }
+    if (%default and 0b0010000000000000000000000000 != 0) {
+      a25 = 0
+    }
+    if (%default and 0b0100000000000000000000000000 != 0) {
+      a26 = 0
+    }
+    if (%default and 0b1000000000000000000000000000 != 0) {
+      a27 = 0
+    }
+    if (%default and 0b00010000000000000000000000000000 != 0) {
+      a28 = 0
+    }
+    if (%default and 0b00100000000000000000000000000000 != 0) {
+      a29 = 0
+    }
+    if (%default and 0b01000000000000000000000000000000 != 0) {
+      a30 = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31ParametersWithSomeUnstable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31ParametersWithSomeUnstable\133useFir = false\135.txt"
new file mode 100644
index 0000000..09d27fa
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31ParametersWithSomeUnstable\133useFir = false\135.txt"
@@ -0,0 +1,401 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Foo = Foo(),
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0,
+    a15: Int = 0,
+    a16: Int = 0,
+    a17: Int = 0,
+    a18: Int = 0,
+    a19: Int = 0,
+    a20: Int = 0,
+    a21: Int = 0,
+    a22: Int = 0,
+    a23: Int = 0,
+    a24: Int = 0,
+    a25: Int = 0,
+    a26: Int = 0,
+    a27: Int = 0,
+    a28: Int = 0,
+    a29: Int = 0,
+    a30: Int = 0,
+    a31: Foo = Foo()
+) {
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    used(a31)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Foo?, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, a31: Foo?, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int, %default1: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  val %dirty2 = %changed2
+  val %dirty3 = %changed3
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%default and 0b001000000000 == 0 && %composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b1000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000
+  } else if (%changed1 and 0b01110000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b00010000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000000000000000
+  } else if (%changed1 and 0b001110000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b00100000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000000000000000
+  } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b01000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000000000000000
+  } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b10000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000000000000000
+  } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b000100000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110
+  } else if (%changed2 and 0b1110 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
+  }
+  if (%default and 0b001000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000
+  } else if (%changed2 and 0b01110000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b010000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000
+  } else if (%changed2 and 0b001110000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b100000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000
+  } else if (%changed2 and 0b0001110000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0001000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000
+  } else if (%changed2 and 0b1110000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b0010000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000
+  } else if (%changed2 and 0b01110000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b0100000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000000000000000
+  } else if (%changed2 and 0b001110000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b1000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000000000000000
+  } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b00010000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000000000000000
+  } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b00100000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000000000000000
+  } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b01000000000000000000000000000000 != 0) {
+    %dirty3 = %dirty3 or 0b0110
+  } else if (%changed3 and 0b1110 == 0) {
+    %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
+  }
+  if (%changed3 and 0b01110000 == 0) {
+    %dirty3 = %dirty3 or if (%default1 and 0b0001 == 0 && %composer.changed(a31)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a00 = 0
+      }
+      if (%default and 0b0010 != 0) {
+        a01 = 0
+      }
+      if (%default and 0b0100 != 0) {
+        a02 = 0
+      }
+      if (%default and 0b1000 != 0) {
+        a03 = 0
+      }
+      if (%default and 0b00010000 != 0) {
+        a04 = 0
+      }
+      if (%default and 0b00100000 != 0) {
+        a05 = 0
+      }
+      if (%default and 0b01000000 != 0) {
+        a06 = 0
+      }
+      if (%default and 0b10000000 != 0) {
+        a07 = 0
+      }
+      if (%default and 0b000100000000 != 0) {
+        a08 = 0
+      }
+      if (%default and 0b001000000000 != 0) {
+        a09 = Foo()
+        %dirty = %dirty and 0b01110000000000000000000000000000.inv()
+      }
+      if (%default and 0b010000000000 != 0) {
+        a10 = 0
+      }
+      if (%default and 0b100000000000 != 0) {
+        a11 = 0
+      }
+      if (%default and 0b0001000000000000 != 0) {
+        a12 = 0
+      }
+      if (%default and 0b0010000000000000 != 0) {
+        a13 = 0
+      }
+      if (%default and 0b0100000000000000 != 0) {
+        a14 = 0
+      }
+      if (%default and 0b1000000000000000 != 0) {
+        a15 = 0
+      }
+      if (%default and 0b00010000000000000000 != 0) {
+        a16 = 0
+      }
+      if (%default and 0b00100000000000000000 != 0) {
+        a17 = 0
+      }
+      if (%default and 0b01000000000000000000 != 0) {
+        a18 = 0
+      }
+      if (%default and 0b10000000000000000000 != 0) {
+        a19 = 0
+      }
+      if (%default and 0b000100000000000000000000 != 0) {
+        a20 = 0
+      }
+      if (%default and 0b001000000000000000000000 != 0) {
+        a21 = 0
+      }
+      if (%default and 0b010000000000000000000000 != 0) {
+        a22 = 0
+      }
+      if (%default and 0b100000000000000000000000 != 0) {
+        a23 = 0
+      }
+      if (%default and 0b0001000000000000000000000000 != 0) {
+        a24 = 0
+      }
+      if (%default and 0b0010000000000000000000000000 != 0) {
+        a25 = 0
+      }
+      if (%default and 0b0100000000000000000000000000 != 0) {
+        a26 = 0
+      }
+      if (%default and 0b1000000000000000000000000000 != 0) {
+        a27 = 0
+      }
+      if (%default and 0b00010000000000000000000000000000 != 0) {
+        a28 = 0
+      }
+      if (%default and 0b00100000000000000000000000000000 != 0) {
+        a29 = 0
+      }
+      if (%default and 0b01000000000000000000000000000000 != 0) {
+        a30 = 0
+      }
+      if (%default1 and 0b0001 != 0) {
+        a31 = Foo()
+        %dirty3 = %dirty3 and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b001000000000 != 0) {
+        %dirty = %dirty and 0b01110000000000000000000000000000.inv()
+      }
+      if (%default1 and 0b0001 != 0) {
+        %dirty3 = %dirty3 and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    used(a31)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default, %default1)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31ParametersWithSomeUnstable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31ParametersWithSomeUnstable\133useFir = true\135.txt"
new file mode 100644
index 0000000..09d27fa
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31ParametersWithSomeUnstable\133useFir = true\135.txt"
@@ -0,0 +1,401 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Foo = Foo(),
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0,
+    a15: Int = 0,
+    a16: Int = 0,
+    a17: Int = 0,
+    a18: Int = 0,
+    a19: Int = 0,
+    a20: Int = 0,
+    a21: Int = 0,
+    a22: Int = 0,
+    a23: Int = 0,
+    a24: Int = 0,
+    a25: Int = 0,
+    a26: Int = 0,
+    a27: Int = 0,
+    a28: Int = 0,
+    a29: Int = 0,
+    a30: Int = 0,
+    a31: Foo = Foo()
+) {
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    used(a31)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Foo?, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, a31: Foo?, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int, %default1: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  val %dirty2 = %changed2
+  val %dirty3 = %changed3
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%default and 0b001000000000 == 0 && %composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b1000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000
+  } else if (%changed1 and 0b01110000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b00010000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000000000000000
+  } else if (%changed1 and 0b001110000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b00100000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000000000000000
+  } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b01000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000000000000000
+  } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b10000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000000000000000
+  } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b000100000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110
+  } else if (%changed2 and 0b1110 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
+  }
+  if (%default and 0b001000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000
+  } else if (%changed2 and 0b01110000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b010000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000
+  } else if (%changed2 and 0b001110000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b100000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000
+  } else if (%changed2 and 0b0001110000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0001000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000
+  } else if (%changed2 and 0b1110000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b0010000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000
+  } else if (%changed2 and 0b01110000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b0100000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000000000000000
+  } else if (%changed2 and 0b001110000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b1000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000000000000000
+  } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b00010000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000000000000000
+  } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b00100000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000000000000000
+  } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b01000000000000000000000000000000 != 0) {
+    %dirty3 = %dirty3 or 0b0110
+  } else if (%changed3 and 0b1110 == 0) {
+    %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
+  }
+  if (%changed3 and 0b01110000 == 0) {
+    %dirty3 = %dirty3 or if (%default1 and 0b0001 == 0 && %composer.changed(a31)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a00 = 0
+      }
+      if (%default and 0b0010 != 0) {
+        a01 = 0
+      }
+      if (%default and 0b0100 != 0) {
+        a02 = 0
+      }
+      if (%default and 0b1000 != 0) {
+        a03 = 0
+      }
+      if (%default and 0b00010000 != 0) {
+        a04 = 0
+      }
+      if (%default and 0b00100000 != 0) {
+        a05 = 0
+      }
+      if (%default and 0b01000000 != 0) {
+        a06 = 0
+      }
+      if (%default and 0b10000000 != 0) {
+        a07 = 0
+      }
+      if (%default and 0b000100000000 != 0) {
+        a08 = 0
+      }
+      if (%default and 0b001000000000 != 0) {
+        a09 = Foo()
+        %dirty = %dirty and 0b01110000000000000000000000000000.inv()
+      }
+      if (%default and 0b010000000000 != 0) {
+        a10 = 0
+      }
+      if (%default and 0b100000000000 != 0) {
+        a11 = 0
+      }
+      if (%default and 0b0001000000000000 != 0) {
+        a12 = 0
+      }
+      if (%default and 0b0010000000000000 != 0) {
+        a13 = 0
+      }
+      if (%default and 0b0100000000000000 != 0) {
+        a14 = 0
+      }
+      if (%default and 0b1000000000000000 != 0) {
+        a15 = 0
+      }
+      if (%default and 0b00010000000000000000 != 0) {
+        a16 = 0
+      }
+      if (%default and 0b00100000000000000000 != 0) {
+        a17 = 0
+      }
+      if (%default and 0b01000000000000000000 != 0) {
+        a18 = 0
+      }
+      if (%default and 0b10000000000000000000 != 0) {
+        a19 = 0
+      }
+      if (%default and 0b000100000000000000000000 != 0) {
+        a20 = 0
+      }
+      if (%default and 0b001000000000000000000000 != 0) {
+        a21 = 0
+      }
+      if (%default and 0b010000000000000000000000 != 0) {
+        a22 = 0
+      }
+      if (%default and 0b100000000000000000000000 != 0) {
+        a23 = 0
+      }
+      if (%default and 0b0001000000000000000000000000 != 0) {
+        a24 = 0
+      }
+      if (%default and 0b0010000000000000000000000000 != 0) {
+        a25 = 0
+      }
+      if (%default and 0b0100000000000000000000000000 != 0) {
+        a26 = 0
+      }
+      if (%default and 0b1000000000000000000000000000 != 0) {
+        a27 = 0
+      }
+      if (%default and 0b00010000000000000000000000000000 != 0) {
+        a28 = 0
+      }
+      if (%default and 0b00100000000000000000000000000000 != 0) {
+        a29 = 0
+      }
+      if (%default and 0b01000000000000000000000000000000 != 0) {
+        a30 = 0
+      }
+      if (%default1 and 0b0001 != 0) {
+        a31 = Foo()
+        %dirty3 = %dirty3 and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b001000000000 != 0) {
+        %dirty = %dirty and 0b01110000000000000000000000000000.inv()
+      }
+      if (%default1 and 0b0001 != 0) {
+        %dirty3 = %dirty3 and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    used(a31)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default, %default1)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31Parameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31Parameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..a192882
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31Parameters\133useFir = false\135.txt"
@@ -0,0 +1,391 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Int = 0,
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0,
+    a15: Int = 0,
+    a16: Int = 0,
+    a17: Int = 0,
+    a18: Int = 0,
+    a19: Int = 0,
+    a20: Int = 0,
+    a21: Int = 0,
+    a22: Int = 0,
+    a23: Int = 0,
+    a24: Int = 0,
+    a25: Int = 0,
+    a26: Int = 0,
+    a27: Int = 0,
+    a28: Int = 0,
+    a29: Int = 0,
+    a30: Int = 0,
+    a31: Int = 0
+) {
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    used(a31)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, a31: Int, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int, %default1: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  val %dirty2 = %changed2
+  val %dirty3 = %changed3
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b001000000000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000000000000000
+  } else if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b1000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000
+  } else if (%changed1 and 0b01110000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b00010000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000000000000000
+  } else if (%changed1 and 0b001110000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b00100000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000000000000000
+  } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b01000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000000000000000
+  } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b10000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000000000000000
+  } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b000100000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110
+  } else if (%changed2 and 0b1110 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
+  }
+  if (%default and 0b001000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000
+  } else if (%changed2 and 0b01110000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b010000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000
+  } else if (%changed2 and 0b001110000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b100000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000
+  } else if (%changed2 and 0b0001110000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0001000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000
+  } else if (%changed2 and 0b1110000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b0010000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000
+  } else if (%changed2 and 0b01110000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b0100000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000000000000000
+  } else if (%changed2 and 0b001110000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b1000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000000000000000
+  } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b00010000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000000000000000
+  } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b00100000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000000000000000
+  } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b01000000000000000000000000000000 != 0) {
+    %dirty3 = %dirty3 or 0b0110
+  } else if (%changed3 and 0b1110 == 0) {
+    %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
+  }
+  if (%default1 and 0b0001 != 0) {
+    %dirty3 = %dirty3 or 0b00110000
+  } else if (%changed3 and 0b01110000 == 0) {
+    %dirty3 = %dirty3 or if (%composer.changed(a31)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a00 = 0
+    }
+    if (%default and 0b0010 != 0) {
+      a01 = 0
+    }
+    if (%default and 0b0100 != 0) {
+      a02 = 0
+    }
+    if (%default and 0b1000 != 0) {
+      a03 = 0
+    }
+    if (%default and 0b00010000 != 0) {
+      a04 = 0
+    }
+    if (%default and 0b00100000 != 0) {
+      a05 = 0
+    }
+    if (%default and 0b01000000 != 0) {
+      a06 = 0
+    }
+    if (%default and 0b10000000 != 0) {
+      a07 = 0
+    }
+    if (%default and 0b000100000000 != 0) {
+      a08 = 0
+    }
+    if (%default and 0b001000000000 != 0) {
+      a09 = 0
+    }
+    if (%default and 0b010000000000 != 0) {
+      a10 = 0
+    }
+    if (%default and 0b100000000000 != 0) {
+      a11 = 0
+    }
+    if (%default and 0b0001000000000000 != 0) {
+      a12 = 0
+    }
+    if (%default and 0b0010000000000000 != 0) {
+      a13 = 0
+    }
+    if (%default and 0b0100000000000000 != 0) {
+      a14 = 0
+    }
+    if (%default and 0b1000000000000000 != 0) {
+      a15 = 0
+    }
+    if (%default and 0b00010000000000000000 != 0) {
+      a16 = 0
+    }
+    if (%default and 0b00100000000000000000 != 0) {
+      a17 = 0
+    }
+    if (%default and 0b01000000000000000000 != 0) {
+      a18 = 0
+    }
+    if (%default and 0b10000000000000000000 != 0) {
+      a19 = 0
+    }
+    if (%default and 0b000100000000000000000000 != 0) {
+      a20 = 0
+    }
+    if (%default and 0b001000000000000000000000 != 0) {
+      a21 = 0
+    }
+    if (%default and 0b010000000000000000000000 != 0) {
+      a22 = 0
+    }
+    if (%default and 0b100000000000000000000000 != 0) {
+      a23 = 0
+    }
+    if (%default and 0b0001000000000000000000000000 != 0) {
+      a24 = 0
+    }
+    if (%default and 0b0010000000000000000000000000 != 0) {
+      a25 = 0
+    }
+    if (%default and 0b0100000000000000000000000000 != 0) {
+      a26 = 0
+    }
+    if (%default and 0b1000000000000000000000000000 != 0) {
+      a27 = 0
+    }
+    if (%default and 0b00010000000000000000000000000000 != 0) {
+      a28 = 0
+    }
+    if (%default and 0b00100000000000000000000000000000 != 0) {
+      a29 = 0
+    }
+    if (%default and 0b01000000000000000000000000000000 != 0) {
+      a30 = 0
+    }
+    if (%default1 and 0b0001 != 0) {
+      a31 = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    used(a31)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default, %default1)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31Parameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31Parameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..a192882
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/test31Parameters\133useFir = true\135.txt"
@@ -0,0 +1,391 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Int = 0,
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0,
+    a15: Int = 0,
+    a16: Int = 0,
+    a17: Int = 0,
+    a18: Int = 0,
+    a19: Int = 0,
+    a20: Int = 0,
+    a21: Int = 0,
+    a22: Int = 0,
+    a23: Int = 0,
+    a24: Int = 0,
+    a25: Int = 0,
+    a26: Int = 0,
+    a27: Int = 0,
+    a28: Int = 0,
+    a29: Int = 0,
+    a30: Int = 0,
+    a31: Int = 0
+) {
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    used(a31)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, a31: Int, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int, %default1: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  val %dirty2 = %changed2
+  val %dirty3 = %changed3
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b001000000000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000000000000000
+  } else if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b1000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000
+  } else if (%changed1 and 0b01110000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b00010000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000000000000000
+  } else if (%changed1 and 0b001110000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a16)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b00100000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000000000000000
+  } else if (%changed1 and 0b0001110000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a17)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b01000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000000000000000
+  } else if (%changed1 and 0b1110000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a18)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b10000000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000000000000000
+  } else if (%changed1 and 0b01110000000000000000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a19)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b000100000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110
+  } else if (%changed2 and 0b1110 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a20)) 0b0100 else 0b0010
+  }
+  if (%default and 0b001000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000
+  } else if (%changed2 and 0b01110000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a21)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b010000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000
+  } else if (%changed2 and 0b001110000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a22)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b100000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000
+  } else if (%changed2 and 0b0001110000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a23)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0001000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000
+  } else if (%changed2 and 0b1110000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a24)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b0010000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000
+  } else if (%changed2 and 0b01110000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a25)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b0100000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b000110000000000000000000
+  } else if (%changed2 and 0b001110000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a26)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b1000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b110000000000000000000000
+  } else if (%changed2 and 0b0001110000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a27)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b00010000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b0110000000000000000000000000
+  } else if (%changed2 and 0b1110000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a28)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b00100000000000000000000000000000 != 0) {
+    %dirty2 = %dirty2 or 0b00110000000000000000000000000000
+  } else if (%changed2 and 0b01110000000000000000000000000000 == 0) {
+    %dirty2 = %dirty2 or if (%composer.changed(a29)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b01000000000000000000000000000000 != 0) {
+    %dirty3 = %dirty3 or 0b0110
+  } else if (%changed3 and 0b1110 == 0) {
+    %dirty3 = %dirty3 or if (%composer.changed(a30)) 0b0100 else 0b0010
+  }
+  if (%default1 and 0b0001 != 0) {
+    %dirty3 = %dirty3 or 0b00110000
+  } else if (%changed3 and 0b01110000 == 0) {
+    %dirty3 = %dirty3 or if (%composer.changed(a31)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty2 and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty3 and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a00 = 0
+    }
+    if (%default and 0b0010 != 0) {
+      a01 = 0
+    }
+    if (%default and 0b0100 != 0) {
+      a02 = 0
+    }
+    if (%default and 0b1000 != 0) {
+      a03 = 0
+    }
+    if (%default and 0b00010000 != 0) {
+      a04 = 0
+    }
+    if (%default and 0b00100000 != 0) {
+      a05 = 0
+    }
+    if (%default and 0b01000000 != 0) {
+      a06 = 0
+    }
+    if (%default and 0b10000000 != 0) {
+      a07 = 0
+    }
+    if (%default and 0b000100000000 != 0) {
+      a08 = 0
+    }
+    if (%default and 0b001000000000 != 0) {
+      a09 = 0
+    }
+    if (%default and 0b010000000000 != 0) {
+      a10 = 0
+    }
+    if (%default and 0b100000000000 != 0) {
+      a11 = 0
+    }
+    if (%default and 0b0001000000000000 != 0) {
+      a12 = 0
+    }
+    if (%default and 0b0010000000000000 != 0) {
+      a13 = 0
+    }
+    if (%default and 0b0100000000000000 != 0) {
+      a14 = 0
+    }
+    if (%default and 0b1000000000000000 != 0) {
+      a15 = 0
+    }
+    if (%default and 0b00010000000000000000 != 0) {
+      a16 = 0
+    }
+    if (%default and 0b00100000000000000000 != 0) {
+      a17 = 0
+    }
+    if (%default and 0b01000000000000000000 != 0) {
+      a18 = 0
+    }
+    if (%default and 0b10000000000000000000 != 0) {
+      a19 = 0
+    }
+    if (%default and 0b000100000000000000000000 != 0) {
+      a20 = 0
+    }
+    if (%default and 0b001000000000000000000000 != 0) {
+      a21 = 0
+    }
+    if (%default and 0b010000000000000000000000 != 0) {
+      a22 = 0
+    }
+    if (%default and 0b100000000000000000000000 != 0) {
+      a23 = 0
+    }
+    if (%default and 0b0001000000000000000000000000 != 0) {
+      a24 = 0
+    }
+    if (%default and 0b0010000000000000000000000000 != 0) {
+      a25 = 0
+    }
+    if (%default and 0b0100000000000000000000000000 != 0) {
+      a26 = 0
+    }
+    if (%default and 0b1000000000000000000000000000 != 0) {
+      a27 = 0
+    }
+    if (%default and 0b00010000000000000000000000000000 != 0) {
+      a28 = 0
+    }
+    if (%default and 0b00100000000000000000000000000000 != 0) {
+      a29 = 0
+    }
+    if (%default and 0b01000000000000000000000000000000 != 0) {
+      a30 = 0
+    }
+    if (%default1 and 0b0001 != 0) {
+      a31 = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    used(a00)
+    used(a01)
+    used(a02)
+    used(a03)
+    used(a04)
+    used(a05)
+    used(a06)
+    used(a07)
+    used(a08)
+    used(a09)
+    used(a10)
+    used(a11)
+    used(a12)
+    used(a13)
+    used(a14)
+    used(a15)
+    used(a16)
+    used(a17)
+    used(a18)
+    used(a19)
+    used(a20)
+    used(a21)
+    used(a22)
+    used(a23)
+    used(a24)
+    used(a25)
+    used(a26)
+    used(a27)
+    used(a28)
+    used(a29)
+    used(a30)
+    used(a31)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), updateChangedFlags(%changed2), updateChangedFlags(%changed3), %default, %default1)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..f8184ab
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+    A(1)
+    B()
+    B(2)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(1)>,<B()>,<B(2)>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(1, %composer, 0b0110)
+    B(0, %composer, 0, 0b0001)
+    B(2, %composer, 0b0110, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..f8184ab
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+    A(1)
+    B()
+    B(2)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(1)>,<B()>,<B(2)>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(1, %composer, 0b0110)
+    B(0, %composer, 0, 0b0001)
+    B(2, %composer, 0b0110, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsForFakeOverridesSuperMethods\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsForFakeOverridesSuperMethods\133useFir = false\135.txt"
new file mode 100644
index 0000000..4e64e5f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsForFakeOverridesSuperMethods\133useFir = false\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+open class Foo {
+    @NonRestartableComposable @Composable fun foo(x: Int = 0) {}
+}
+class Bar: Foo() {
+    @NonRestartableComposable @Composable fun Example() {
+        foo()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+open class Foo {
+  @NonRestartableComposable
+  @Composable
+  fun foo(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(foo):Test.kt")
+    if (%default and 0b0001 != 0) {
+      x = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+  }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class Bar : Foo {
+  @NonRestartableComposable
+  @Composable
+  fun Example(%composer: Composer?, %changed: Int) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(Example)<foo()>:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    foo(0, %composer, 0b01110000 and %changed shl 0b0011, 0b0001)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsForFakeOverridesSuperMethods\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsForFakeOverridesSuperMethods\133useFir = true\135.txt"
new file mode 100644
index 0000000..4e64e5f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsForFakeOverridesSuperMethods\133useFir = true\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+open class Foo {
+    @NonRestartableComposable @Composable fun foo(x: Int = 0) {}
+}
+class Bar: Foo() {
+    @NonRestartableComposable @Composable fun Example() {
+        foo()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+open class Foo {
+  @NonRestartableComposable
+  @Composable
+  fun foo(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(foo):Test.kt")
+    if (%default and 0b0001 != 0) {
+      x = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+  }
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class Bar : Foo {
+  @NonRestartableComposable
+  @Composable
+  fun Example(%composer: Composer?, %changed: Int) {
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(Example)<foo()>:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    foo(0, %composer, 0b01110000 and %changed shl 0b0011, 0b0001)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsOnInvoke\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsOnInvoke\133useFir = false\135.txt"
new file mode 100644
index 0000000..842346e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsOnInvoke\133useFir = false\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Bar() {
+    HasDefault()
+    NoDefault("Some Text")
+    MultipleDefault()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Bar(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Bar)<HasDef...>,<NoDefa...>,<Multip...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  HasDefault(null, %composer, 0b00110000, 0b0001)
+  NoDefault("Some Text", %composer, 0b00110110)
+  MultipleDefault(null, 0, %composer, 0b000110000000, 0b0011)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsOnInvoke\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsOnInvoke\133useFir = true\135.txt"
new file mode 100644
index 0000000..842346e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testDefaultArgsOnInvoke\133useFir = true\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@NonRestartableComposable
+@Composable
+fun Bar() {
+    HasDefault()
+    NoDefault("Some Text")
+    MultipleDefault()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Bar(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Bar)<HasDef...>,<NoDefa...>,<Multip...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  HasDefault(null, %composer, 0b00110000, 0b0001)
+  NoDefault("Some Text", %composer, 0b00110110)
+  MultipleDefault(null, 0, %composer, 0b000110000000, 0b0011)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testEarlierParameterReferences\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testEarlierParameterReferences\133useFir = false\135.txt"
new file mode 100644
index 0000000..c44fe5e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testEarlierParameterReferences\133useFir = false\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun A(a: Int = 0, b: Int = a + 1) {
+    print(a)
+    print(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(a: Int, b: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 0
+      }
+      if (%default and 0b0010 != 0) {
+        b = a + 1
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(a)
+    print(b)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testEarlierParameterReferences\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testEarlierParameterReferences\133useFir = true\135.txt"
new file mode 100644
index 0000000..c44fe5e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testEarlierParameterReferences\133useFir = true\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun A(a: Int = 0, b: Int = a + 1) {
+    print(a)
+    print(b)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(a: Int, b: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 0
+      }
+      if (%default and 0b0010 != 0) {
+        b = a + 1
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(a)
+    print(b)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testInlineClassDefaultParameter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testInlineClassDefaultParameter\133useFir = false\135.txt"
new file mode 100644
index 0000000..33764ff
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testInlineClassDefaultParameter\133useFir = false\135.txt"
@@ -0,0 +1,68 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(foo: Foo = Foo(0)) {
+    print(foo)
+}
+@Composable
+fun Test() {
+    Example()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(foo: Foo, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)P(0:Foo):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(foo))) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      foo = Foo(0)
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(foo)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(foo, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Example(<unsafe-coerce>(0), %composer, 0, 0b0001)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testInlineClassDefaultParameter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testInlineClassDefaultParameter\133useFir = true\135.txt"
new file mode 100644
index 0000000..33764ff
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testInlineClassDefaultParameter\133useFir = true\135.txt"
@@ -0,0 +1,68 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Example(foo: Foo = Foo(0)) {
+    print(foo)
+}
+@Composable
+fun Test() {
+    Example()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(foo: Foo, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)P(0:Foo):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(foo))) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      foo = Foo(0)
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(foo)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(foo, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Example(<unsafe-coerce>(0), %composer, 0, 0b0001)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testNonStaticDefaultExpressions\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testNonStaticDefaultExpressions\133useFir = false\135.txt"
new file mode 100644
index 0000000..07dd552
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testNonStaticDefaultExpressions\133useFir = false\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test(x: Int = makeInt()) {
+    used(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        x = makeInt()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(x)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testNonStaticDefaultExpressions\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testNonStaticDefaultExpressions\133useFir = true\135.txt"
new file mode 100644
index 0000000..07dd552
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testNonStaticDefaultExpressions\133useFir = true\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test(x: Int = makeInt()) {
+    used(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        x = makeInt()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(x)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testParameterHoles\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testParameterHoles\133useFir = false\135.txt"
new file mode 100644
index 0000000..32355cb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testParameterHoles\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+    A(0, 1, 2)
+    A(a = 0, c = 2)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(0,>,<A(a>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(0, 1, 2, 0, 0, %composer, 0b000110110110, 0b00011000)
+    A(0, 0, 2, 0, 0, %composer, 0b000110000110, 0b00011010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testParameterHoles\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testParameterHoles\133useFir = true\135.txt"
new file mode 100644
index 0000000..32355cb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testParameterHoles\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+@Composable
+fun Test() {
+    A(0, 1, 2)
+    A(a = 0, c = 2)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(0,>,<A(a>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(0, 1, 2, 0, 0, %composer, 0b000110110110, 0b00011000)
+    A(0, 0, 2, 0, 0, %composer, 0b000110000110, 0b00011010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testUnusedDefaultComposableLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testUnusedDefaultComposableLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..5f59357
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testUnusedDefaultComposableLambda\133useFir = false\135.txt"
@@ -0,0 +1,24 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+inline fun Bar(unused: @Composable () -> Unit = { }) {}
+fun Foo() { Bar() }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun Bar(unused: Function2<Composer, Int, Unit> = { %composer: Composer?, %changed: Int ->
+  sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+  Unit
+  sourceInformationMarkerEnd(%composer)
+}
+) { }
+fun Foo() {
+  Bar()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testUnusedDefaultComposableLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testUnusedDefaultComposableLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..5f59357
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.DefaultParamTransformTests/testUnusedDefaultComposableLambda\133useFir = true\135.txt"
@@ -0,0 +1,24 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+
+inline fun Bar(unused: @Composable () -> Unit = { }) {}
+fun Foo() { Bar() }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun Bar(unused: Function2<Composer, Int, Unit> = { %composer: Composer?, %changed: Int ->
+  sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+  Unit
+  sourceInformationMarkerEnd(%composer)
+}
+) { }
+fun Foo() {
+  Bar()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test15Parameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test15Parameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..605a789
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test15Parameters\133useFir = false\135.txt"
@@ -0,0 +1,211 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Int = 0,
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0
+) {
+    // in order
+    Example(
+        a00,
+        a01,
+        a02,
+        a03,
+        a04,
+        a05,
+        a06,
+        a07,
+        a08,
+        a09,
+        a10,
+        a11,
+        a12,
+        a13,
+        a14
+    )
+    // in opposite order
+    Example(
+        a14,
+        a13,
+        a12,
+        a11,
+        a10,
+        a09,
+        a08,
+        a07,
+        a06,
+        a05,
+        a04,
+        a03,
+        a02,
+        a01,
+        a00
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, %composer: Composer?, %changed: Int, %changed1: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b001000000000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000000000000000
+  } else if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b1011011011011011 != 0b0010010010010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a00 = 0
+    }
+    if (%default and 0b0010 != 0) {
+      a01 = 0
+    }
+    if (%default and 0b0100 != 0) {
+      a02 = 0
+    }
+    if (%default and 0b1000 != 0) {
+      a03 = 0
+    }
+    if (%default and 0b00010000 != 0) {
+      a04 = 0
+    }
+    if (%default and 0b00100000 != 0) {
+      a05 = 0
+    }
+    if (%default and 0b01000000 != 0) {
+      a06 = 0
+    }
+    if (%default and 0b10000000 != 0) {
+      a07 = 0
+    }
+    if (%default and 0b000100000000 != 0) {
+      a08 = 0
+    }
+    if (%default and 0b001000000000 != 0) {
+      a09 = 0
+    }
+    if (%default and 0b010000000000 != 0) {
+      a10 = 0
+    }
+    if (%default and 0b100000000000 != 0) {
+      a11 = 0
+    }
+    if (%default and 0b0001000000000000 != 0) {
+      a12 = 0
+    }
+    if (%default and 0b0010000000000000 != 0) {
+      a13 = 0
+    }
+    if (%default and 0b0100000000000000 != 0) {
+      a14 = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, %composer, 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty or 0b1110000000000000 and %dirty or 0b01110000000000000000 and %dirty or 0b001110000000000000000000 and %dirty or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty or 0b01110000000000000000000000000000 and %dirty, 0b1110 and %dirty1 or 0b01110000 and %dirty1 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 or 0b1110000000000000 and %dirty1, 0)
+    Example(a14, a13, a12, a11, a10, a09, a08, a07, a06, a05, a04, a03, a02, a01, a00, %composer, 0b1110 and %dirty1 shr 0b1100 or 0b01110000 and %dirty1 shr 0b0110 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 shl 0b0110 or 0b1110000000000000 and %dirty1 shl 0b1100 or 0b01110000000000000000 and %dirty shr 0b1100 or 0b001110000000000000000000 and %dirty shr 0b0110 or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty shl 0b0110 or 0b01110000000000000000000000000000 and %dirty shl 0b1100, 0b1110 and %dirty shr 0b1100 or 0b01110000 and %dirty shr 0b0110 or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty shl 0b0110 or 0b1110000000000000 and %dirty shl 0b1100, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test15Parameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test15Parameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..605a789
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test15Parameters\133useFir = true\135.txt"
@@ -0,0 +1,211 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Int = 0,
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0
+) {
+    // in order
+    Example(
+        a00,
+        a01,
+        a02,
+        a03,
+        a04,
+        a05,
+        a06,
+        a07,
+        a08,
+        a09,
+        a10,
+        a11,
+        a12,
+        a13,
+        a14
+    )
+    // in opposite order
+    Example(
+        a14,
+        a13,
+        a12,
+        a11,
+        a10,
+        a09,
+        a08,
+        a07,
+        a06,
+        a05,
+        a04,
+        a03,
+        a02,
+        a01,
+        a00
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, %composer: Composer?, %changed: Int, %changed1: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b001000000000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000000000000000
+  } else if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b1011011011011011 != 0b0010010010010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a00 = 0
+    }
+    if (%default and 0b0010 != 0) {
+      a01 = 0
+    }
+    if (%default and 0b0100 != 0) {
+      a02 = 0
+    }
+    if (%default and 0b1000 != 0) {
+      a03 = 0
+    }
+    if (%default and 0b00010000 != 0) {
+      a04 = 0
+    }
+    if (%default and 0b00100000 != 0) {
+      a05 = 0
+    }
+    if (%default and 0b01000000 != 0) {
+      a06 = 0
+    }
+    if (%default and 0b10000000 != 0) {
+      a07 = 0
+    }
+    if (%default and 0b000100000000 != 0) {
+      a08 = 0
+    }
+    if (%default and 0b001000000000 != 0) {
+      a09 = 0
+    }
+    if (%default and 0b010000000000 != 0) {
+      a10 = 0
+    }
+    if (%default and 0b100000000000 != 0) {
+      a11 = 0
+    }
+    if (%default and 0b0001000000000000 != 0) {
+      a12 = 0
+    }
+    if (%default and 0b0010000000000000 != 0) {
+      a13 = 0
+    }
+    if (%default and 0b0100000000000000 != 0) {
+      a14 = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, %composer, 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty or 0b1110000000000000 and %dirty or 0b01110000000000000000 and %dirty or 0b001110000000000000000000 and %dirty or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty or 0b01110000000000000000000000000000 and %dirty, 0b1110 and %dirty1 or 0b01110000 and %dirty1 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 or 0b1110000000000000 and %dirty1, 0)
+    Example(a14, a13, a12, a11, a10, a09, a08, a07, a06, a05, a04, a03, a02, a01, a00, %composer, 0b1110 and %dirty1 shr 0b1100 or 0b01110000 and %dirty1 shr 0b0110 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 shl 0b0110 or 0b1110000000000000 and %dirty1 shl 0b1100 or 0b01110000000000000000 and %dirty shr 0b1100 or 0b001110000000000000000000 and %dirty shr 0b0110 or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty shl 0b0110 or 0b01110000000000000000000000000000 and %dirty shl 0b1100, 0b1110 and %dirty shr 0b1100 or 0b01110000 and %dirty shr 0b0110 or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty shl 0b0110 or 0b1110000000000000 and %dirty shl 0b1100, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test16Parameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test16Parameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..a380a18
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test16Parameters\133useFir = false\135.txt"
@@ -0,0 +1,222 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Int = 0,
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0,
+    a15: Int = 0
+) {
+    // in order
+    Example(
+        a00,
+        a01,
+        a02,
+        a03,
+        a04,
+        a05,
+        a06,
+        a07,
+        a08,
+        a09,
+        a10,
+        a11,
+        a12,
+        a13,
+        a14,
+        a15
+    )
+    // in opposite order
+    Example(
+        a15,
+        a14,
+        a13,
+        a12,
+        a11,
+        a10,
+        a09,
+        a08,
+        a07,
+        a06,
+        a05,
+        a04,
+        a03,
+        a02,
+        a01,
+        a00
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, %composer: Composer?, %changed: Int, %changed1: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b001000000000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000000000000000
+  } else if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b1000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000
+  } else if (%changed1 and 0b01110000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011 != 0b00010010010010010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a00 = 0
+    }
+    if (%default and 0b0010 != 0) {
+      a01 = 0
+    }
+    if (%default and 0b0100 != 0) {
+      a02 = 0
+    }
+    if (%default and 0b1000 != 0) {
+      a03 = 0
+    }
+    if (%default and 0b00010000 != 0) {
+      a04 = 0
+    }
+    if (%default and 0b00100000 != 0) {
+      a05 = 0
+    }
+    if (%default and 0b01000000 != 0) {
+      a06 = 0
+    }
+    if (%default and 0b10000000 != 0) {
+      a07 = 0
+    }
+    if (%default and 0b000100000000 != 0) {
+      a08 = 0
+    }
+    if (%default and 0b001000000000 != 0) {
+      a09 = 0
+    }
+    if (%default and 0b010000000000 != 0) {
+      a10 = 0
+    }
+    if (%default and 0b100000000000 != 0) {
+      a11 = 0
+    }
+    if (%default and 0b0001000000000000 != 0) {
+      a12 = 0
+    }
+    if (%default and 0b0010000000000000 != 0) {
+      a13 = 0
+    }
+    if (%default and 0b0100000000000000 != 0) {
+      a14 = 0
+    }
+    if (%default and 0b1000000000000000 != 0) {
+      a15 = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, %composer, 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty or 0b1110000000000000 and %dirty or 0b01110000000000000000 and %dirty or 0b001110000000000000000000 and %dirty or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty or 0b01110000000000000000000000000000 and %dirty, 0b1110 and %dirty1 or 0b01110000 and %dirty1 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 or 0b1110000000000000 and %dirty1 or 0b01110000000000000000 and %dirty1, 0)
+    Example(a15, a14, a13, a12, a11, a10, a09, a08, a07, a06, a05, a04, a03, a02, a01, a00, %composer, 0b1110 and %dirty1 shr 0b1111 or 0b01110000 and %dirty1 shr 0b1001 or 0b001110000000 and %dirty1 shr 0b0011 or 0b0001110000000000 and %dirty1 shl 0b0011 or 0b1110000000000000 and %dirty1 shl 0b1001 or 0b01110000000000000000 and %dirty1 shl 0b1111 or 0b001110000000000000000000 and %dirty shr 0b1001 or 0b0001110000000000000000000000 and %dirty shr 0b0011 or 0b1110000000000000000000000000 and %dirty shl 0b0011 or 0b01110000000000000000000000000000 and %dirty shl 0b1001, 0b1110 and %dirty shr 0b1111 or 0b01110000 and %dirty shr 0b1001 or 0b001110000000 and %dirty shr 0b0011 or 0b0001110000000000 and %dirty shl 0b0011 or 0b1110000000000000 and %dirty shl 0b1001 or 0b01110000000000000000 and %dirty shl 0b1111, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test16Parameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test16Parameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..a380a18
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test16Parameters\133useFir = true\135.txt"
@@ -0,0 +1,222 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(
+    a00: Int = 0,
+    a01: Int = 0,
+    a02: Int = 0,
+    a03: Int = 0,
+    a04: Int = 0,
+    a05: Int = 0,
+    a06: Int = 0,
+    a07: Int = 0,
+    a08: Int = 0,
+    a09: Int = 0,
+    a10: Int = 0,
+    a11: Int = 0,
+    a12: Int = 0,
+    a13: Int = 0,
+    a14: Int = 0,
+    a15: Int = 0
+) {
+    // in order
+    Example(
+        a00,
+        a01,
+        a02,
+        a03,
+        a04,
+        a05,
+        a06,
+        a07,
+        a08,
+        a09,
+        a10,
+        a11,
+        a12,
+        a13,
+        a14,
+        a15
+    )
+    // in opposite order
+    Example(
+        a15,
+        a14,
+        a13,
+        a12,
+        a11,
+        a10,
+        a09,
+        a08,
+        a07,
+        a06,
+        a05,
+        a04,
+        a03,
+        a02,
+        a01,
+        a00
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, %composer: Composer?, %changed: Int, %changed1: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
+  val %dirty = %changed
+  val %dirty1 = %changed1
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a00)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a01)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a02)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a03)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a04)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a05)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a06)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%default and 0b10000000 != 0) {
+    %dirty = %dirty or 0b110000000000000000000000
+  } else if (%changed and 0b0001110000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a07)) 0b100000000000000000000000 else 0b010000000000000000000000
+  }
+  if (%default and 0b000100000000 != 0) {
+    %dirty = %dirty or 0b0110000000000000000000000000
+  } else if (%changed and 0b1110000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a08)) 0b0100000000000000000000000000 else 0b0010000000000000000000000000
+  }
+  if (%default and 0b001000000000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000000000000000
+  } else if (%changed and 0b01110000000000000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(a09)) 0b00100000000000000000000000000000 else 0b00010000000000000000000000000000
+  }
+  if (%default and 0b010000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110
+  } else if (%changed1 and 0b1110 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a10)) 0b0100 else 0b0010
+  }
+  if (%default and 0b100000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000
+  } else if (%changed1 and 0b01110000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a11)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0001000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b000110000000
+  } else if (%changed1 and 0b001110000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a12)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b0010000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b110000000000
+  } else if (%changed1 and 0b0001110000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a13)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b0100000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b0110000000000000
+  } else if (%changed1 and 0b1110000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a14)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b1000000000000000 != 0) {
+    %dirty1 = %dirty1 or 0b00110000000000000000
+  } else if (%changed1 and 0b01110000000000000000 == 0) {
+    %dirty1 = %dirty1 or if (%composer.changed(a15)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%dirty and 0b01011011011011011011011011011011 != 0b00010010010010010010010010010010 || %dirty1 and 0b01011011011011011011 != 0b00010010010010010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a00 = 0
+    }
+    if (%default and 0b0010 != 0) {
+      a01 = 0
+    }
+    if (%default and 0b0100 != 0) {
+      a02 = 0
+    }
+    if (%default and 0b1000 != 0) {
+      a03 = 0
+    }
+    if (%default and 0b00010000 != 0) {
+      a04 = 0
+    }
+    if (%default and 0b00100000 != 0) {
+      a05 = 0
+    }
+    if (%default and 0b01000000 != 0) {
+      a06 = 0
+    }
+    if (%default and 0b10000000 != 0) {
+      a07 = 0
+    }
+    if (%default and 0b000100000000 != 0) {
+      a08 = 0
+    }
+    if (%default and 0b001000000000 != 0) {
+      a09 = 0
+    }
+    if (%default and 0b010000000000 != 0) {
+      a10 = 0
+    }
+    if (%default and 0b100000000000 != 0) {
+      a11 = 0
+    }
+    if (%default and 0b0001000000000000 != 0) {
+      a12 = 0
+    }
+    if (%default and 0b0010000000000000 != 0) {
+      a13 = 0
+    }
+    if (%default and 0b0100000000000000 != 0) {
+      a14 = 0
+    }
+    if (%default and 0b1000000000000000 != 0) {
+      a15 = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, %dirty1, <>)
+    }
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, %composer, 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty or 0b1110000000000000 and %dirty or 0b01110000000000000000 and %dirty or 0b001110000000000000000000 and %dirty or 0b0001110000000000000000000000 and %dirty or 0b1110000000000000000000000000 and %dirty or 0b01110000000000000000000000000000 and %dirty, 0b1110 and %dirty1 or 0b01110000 and %dirty1 or 0b001110000000 and %dirty1 or 0b0001110000000000 and %dirty1 or 0b1110000000000000 and %dirty1 or 0b01110000000000000000 and %dirty1, 0)
+    Example(a15, a14, a13, a12, a11, a10, a09, a08, a07, a06, a05, a04, a03, a02, a01, a00, %composer, 0b1110 and %dirty1 shr 0b1111 or 0b01110000 and %dirty1 shr 0b1001 or 0b001110000000 and %dirty1 shr 0b0011 or 0b0001110000000000 and %dirty1 shl 0b0011 or 0b1110000000000000 and %dirty1 shl 0b1001 or 0b01110000000000000000 and %dirty1 shl 0b1111 or 0b001110000000000000000000 and %dirty shr 0b1001 or 0b0001110000000000000000000000 and %dirty shr 0b0011 or 0b1110000000000000000000000000 and %dirty shl 0b0011 or 0b01110000000000000000000000000000 and %dirty shl 0b1001, 0b1110 and %dirty shr 0b1111 or 0b01110000 and %dirty shr 0b1001 or 0b001110000000 and %dirty shr 0b0011 or 0b0001110000000000 and %dirty shl 0b0011 or 0b1110000000000000 and %dirty shl 0b1001 or 0b01110000000000000000 and %dirty shl 0b1111, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, a11, a12, a13, a14, a15, %composer, updateChangedFlags(%changed or 0b0001), updateChangedFlags(%changed1), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testAnnotationChecker\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testAnnotationChecker\133useFir = false\135.txt"
new file mode 100644
index 0000000..9f90663
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testAnnotationChecker\133useFir = false\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Example() {
+    D {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<D>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    D(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testAnnotationChecker\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testAnnotationChecker\133useFir = true\135.txt"
new file mode 100644
index 0000000..9f90663
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testAnnotationChecker\133useFir = true\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Example() {
+    D {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<D>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    D(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrangement\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrangement\133useFir = false\135.txt"
new file mode 100644
index 0000000..5223ae4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrangement\133useFir = false\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Arrangement.Vertical
+
+@Composable
+fun A(
+    arrangement: Vertical = Arrangement.Top
+) {
+    used(arrangement)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(arrangement: Vertical?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(arrangement)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      arrangement = Arrangement.Top
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(arrangement)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(arrangement, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrangement\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrangement\133useFir = true\135.txt"
new file mode 100644
index 0000000..5223ae4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrangement\133useFir = true\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Arrangement.Vertical
+
+@Composable
+fun A(
+    arrangement: Vertical = Arrangement.Top
+) {
+    used(arrangement)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(arrangement: Vertical?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(arrangement)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      arrangement = Arrangement.Top
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(arrangement)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(arrangement, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrayDefaultArgWithState\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrayDefaultArgWithState\133useFir = false\135.txt"
new file mode 100644
index 0000000..9ea5691
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrayDefaultArgWithState\133useFir = false\135.txt"
@@ -0,0 +1,71 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.MutableState
+
+@Composable
+fun VarargComposable(state: MutableState<Int>, vararg values: String = Array(1) { "value " + it }) {
+    state.value
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun VarargComposable(state: MutableState<Int>, values: Array<out String>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(VarargComposable):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(state)) 0b0100 else 0b0010
+  }
+  %composer.startMovableGroup(<>, values.size)
+  val <iterator> = values.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b00100000 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b01110000 == 0) {
+    %dirty = %dirty or 0b00010000
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0010 != 0) {
+        values = Array(1) { it: Int ->
+          val tmp0_return = "value " + it
+          tmp0_return
+        }
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    state.value
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    VarargComposable(state, *values, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrayDefaultArgWithState\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrayDefaultArgWithState\133useFir = true\135.txt"
new file mode 100644
index 0000000..9ea5691
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testArrayDefaultArgWithState\133useFir = true\135.txt"
@@ -0,0 +1,71 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.MutableState
+
+@Composable
+fun VarargComposable(state: MutableState<Int>, vararg values: String = Array(1) { "value " + it }) {
+    state.value
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun VarargComposable(state: MutableState<Int>, values: Array<out String>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(VarargComposable):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(state)) 0b0100 else 0b0010
+  }
+  %composer.startMovableGroup(<>, values.size)
+  val <iterator> = values.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b00100000 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b01110000 == 0) {
+    %dirty = %dirty or 0b00010000
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0010 != 0) {
+        values = Array(1) { it: Int ->
+          val tmp0_return = "value " + it
+          tmp0_return
+        }
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    state.value
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    VarargComposable(state, *values, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testBasicText\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testBasicText\133useFir = false\135.txt"
new file mode 100644
index 0000000..1bbe6b8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testBasicText\133useFir = false\135.txt"
@@ -0,0 +1,75 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.TextLayoutResult
+
+@Composable
+fun BasicText(
+    style: TextStyle = TextStyle.Default,
+    onTextLayout: (TextLayoutResult) -> Unit = {},
+    overflow: TextOverflow = TextOverflow.Clip,
+) {
+    used(style)
+    used(onTextLayout)
+    used(overflow)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun BasicText(style: TextStyle?, onTextLayout: Function1<TextLayoutResult, Unit>?, overflow: TextOverflow, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(BasicText)P(2!,1:c#ui.text.style.TextOverflow):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(style)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(onTextLayout)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(overflow))) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      style = Companion.Default
+    }
+    if (%default and 0b0010 != 0) {
+      onTextLayout = { it: TextLayoutResult ->
+      }
+    }
+    if (%default and 0b0100 != 0) {
+      overflow = Companion.Clip
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(style)
+    used(onTextLayout)
+    used(overflow)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    BasicText(style, onTextLayout, overflow, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testBasicText\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testBasicText\133useFir = true\135.txt"
new file mode 100644
index 0000000..1bbe6b8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testBasicText\133useFir = true\135.txt"
@@ -0,0 +1,75 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.TextLayoutResult
+
+@Composable
+fun BasicText(
+    style: TextStyle = TextStyle.Default,
+    onTextLayout: (TextLayoutResult) -> Unit = {},
+    overflow: TextOverflow = TextOverflow.Clip,
+) {
+    used(style)
+    used(onTextLayout)
+    used(overflow)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun BasicText(style: TextStyle?, onTextLayout: Function1<TextLayoutResult, Unit>?, overflow: TextOverflow, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(BasicText)P(2!,1:c#ui.text.style.TextOverflow):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(style)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(onTextLayout)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(overflow))) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      style = Companion.Default
+    }
+    if (%default and 0b0010 != 0) {
+      onTextLayout = { it: TextLayoutResult ->
+      }
+    }
+    if (%default and 0b0100 != 0) {
+      overflow = Companion.Clip
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(style)
+    used(onTextLayout)
+    used(overflow)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    BasicText(style, onTextLayout, overflow, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableFunExprBody\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableFunExprBody\133useFir = false\135.txt"
new file mode 100644
index 0000000..67cf6c5
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableFunExprBody\133useFir = false\135.txt"
@@ -0,0 +1,29 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Test(x: Int) = A()
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = A(0, 0, %composer, 0, 0b0011)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableFunExprBody\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableFunExprBody\133useFir = true\135.txt"
new file mode 100644
index 0000000..67cf6c5
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableFunExprBody\133useFir = true\135.txt"
@@ -0,0 +1,29 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Test(x: Int) = A()
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = A(0, 0, %composer, 0, 0b0011)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaInvoke\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaInvoke\133useFir = false\135.txt"
new file mode 100644
index 0000000..c90f9f7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaInvoke\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Example(content: @Composable() () -> Unit) {
+    content.invoke()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<invoke...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaInvoke\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaInvoke\133useFir = true\135.txt"
new file mode 100644
index 0000000..c90f9f7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaInvoke\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Example(content: @Composable() () -> Unit) {
+    content.invoke()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<invoke...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParamsAndReturnValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParamsAndReturnValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..03b3be2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParamsAndReturnValue\133useFir = false\135.txt"
@@ -0,0 +1,83 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun SomeThing(content: @Composable() () -> Unit) { content() }
+
+@Composable
+fun Example() {
+    SomeThing {
+        val id = object {}
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun SomeThing(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SomeThing)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SomeThing(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<SomeTh...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    SomeThing(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      val id = <block>{
+        object
+      }
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParamsAndReturnValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParamsAndReturnValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..03b3be2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParamsAndReturnValue\133useFir = true\135.txt"
@@ -0,0 +1,83 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun SomeThing(content: @Composable() () -> Unit) { content() }
+
+@Composable
+fun Example() {
+    SomeThing {
+        val id = object {}
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun SomeThing(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SomeThing)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SomeThing(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<SomeTh...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    SomeThing(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      val id = <block>{
+        object
+      }
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..278bc68
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParams\133useFir = false\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+val foo = @Composable { x: Int, y: Foo ->
+    A(x)
+    B(y)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val foo: Function4<Int, Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A(x)>,<B(y)>:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+    }
+    if (%changed and 0b01110000 == 0) {
+      %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
+    }
+    if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(x, %composer, 0b1110 and %dirty)
+      B(y, %composer, 0b1110 and %dirty shr 0b0011)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..278bc68
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithStableParams\133useFir = true\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+val foo = @Composable { x: Int, y: Foo ->
+    A(x)
+    B(y)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val foo: Function4<Int, Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A(x)>,<B(y)>:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+    }
+    if (%changed and 0b01110000 == 0) {
+      %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
+    }
+    if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(x, %composer, 0b1110 and %dirty)
+      B(y, %composer, 0b1110 and %dirty shr 0b0011)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithUnstableParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithUnstableParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..da112a1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithUnstableParams\133useFir = false\135.txt"
@@ -0,0 +1,32 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+val foo = @Composable { x: Int, y: Foo ->
+    A(x)
+    B(y)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val foo: Function4<Int, Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A(x)>,<B(y)>:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %changed)
+    B(y, %composer, 0b1000)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithUnstableParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithUnstableParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..da112a1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdaWithUnstableParams\133useFir = true\135.txt"
@@ -0,0 +1,32 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+val foo = @Composable { x: Int, y: Foo ->
+    A(x)
+    B(y)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val foo: Function4<Int, Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A(x)>,<B(y)>:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %changed)
+    B(y, %composer, 0b1000)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..5cbf9070
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambda\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+val test = @Composable { x: Int ->
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val test: Function3<Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A(x)>:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..5cbf9070
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambda\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+val test = @Composable { x: Int ->
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val test: Function3<Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<A(x)>:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdasWithReturnGetGroups\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdasWithReturnGetGroups\133useFir = false\135.txt"
new file mode 100644
index 0000000..173da83
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdasWithReturnGetGroups\133useFir = false\135.txt"
@@ -0,0 +1,31 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+fun A(factory: @Composable () -> Int): Unit {}
+fun B() = A { 123 }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A(factory: Function2<Composer, Int, Int>) { }
+fun B() {
+  return A { %composer: Composer?, %changed: Int ->
+    %composer.startReplaceableGroup(<>)
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = 123
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    tmp0
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdasWithReturnGetGroups\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdasWithReturnGetGroups\133useFir = true\135.txt"
new file mode 100644
index 0000000..173da83
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableLambdasWithReturnGetGroups\133useFir = true\135.txt"
@@ -0,0 +1,31 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+fun A(factory: @Composable () -> Int): Unit {}
+fun B() = A { 123 }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A(factory: Function2<Composer, Int, Int>) { }
+fun B() {
+  return A { %composer: Composer?, %changed: Int ->
+    %composer.startReplaceableGroup(<>)
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = 123
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    %composer.endReplaceableGroup()
+    tmp0
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableParameter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableParameter\133useFir = false\135.txt"
new file mode 100644
index 0000000..7466bdd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableParameter\133useFir = false\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(a: Int = 0, b: Int = makeInt(), c: Int = 0) {
+    used(a)
+    used(b)
+    used(c)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a: Int, b: Int, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<makeIn...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 0
+      }
+      if (%default and 0b0010 != 0) {
+        b = makeInt(%composer, 0)
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0100 != 0) {
+        c = 0
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    used(c)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableParameter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableParameter\133useFir = true\135.txt"
new file mode 100644
index 0000000..7466bdd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableParameter\133useFir = true\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(a: Int = 0, b: Int = makeInt(), c: Int = 0) {
+    used(a)
+    used(b)
+    used(c)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a: Int, b: Int, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<makeIn...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 0
+      }
+      if (%default and 0b0010 != 0) {
+        b = makeInt(%composer, 0)
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0100 != 0) {
+        c = 0
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    used(c)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableSingletonsAreStatic\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableSingletonsAreStatic\133useFir = false\135.txt"
new file mode 100644
index 0000000..f636b43
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableSingletonsAreStatic\133useFir = false\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(
+    content: @Composable () -> Unit = {}
+) {
+    content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Example(content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      content = ComposableSingletons%TestKt.lambda-1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableSingletonsAreStatic\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableSingletonsAreStatic\133useFir = true\135.txt"
new file mode 100644
index 0000000..f636b43
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableSingletonsAreStatic\133useFir = true\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(
+    content: @Composable () -> Unit = {}
+) {
+    content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Example(content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      content = ComposableSingletons%TestKt.lambda-1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..2e23013
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = false\135.txt"
@@ -0,0 +1,107 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Wrap(y: Int, content: @Composable (x: Int) -> Unit) {
+    content(y)
+}
+@Composable
+fun Test(x: Int = 0, y: Int = 0) {
+    used(y)
+    Wrap(10) {
+        used(it)
+        A(x)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Wrap(y: Int, content: Function3<@[ParameterName(name = 'x')] Int, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Wrap)P(1)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(y)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(y, %composer, 0b1110 and %dirty or 0b01110000 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Wrap(y, content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Wrap(1...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      x = 0
+    }
+    if (%default and 0b0010 != 0) {
+      y = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(y)
+    Wrap(10, composableLambda(%composer, <>, true) { it: Int, %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<A(x)>:Test.kt")
+      val %dirty = %changed
+      if (%changed and 0b1110 == 0) {
+        %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
+      }
+      if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %dirty, -1, <>)
+        }
+        used(it)
+        A(x, 0, %composer, 0, 0b0010)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b00110110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, y, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..78b2e9e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithAndWithoutDefaultParams\133useFir = true\135.txt"
@@ -0,0 +1,107 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Wrap(y: Int, content: @Composable (x: Int) -> Unit) {
+    content(y)
+}
+@Composable
+fun Test(x: Int = 0, y: Int = 0) {
+    used(y)
+    Wrap(10) {
+        used(it)
+        A(x)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Wrap(y: Int, content: Function3<@[ParameterName(name = 'x')] Int, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Wrap)P(1)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(y)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(y, %composer, 0b1110 and %dirty or 0b01110000 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Wrap(y, content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Wrap(1...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      x = 0
+    }
+    if (%default and 0b0010 != 0) {
+      y = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(y)
+    Wrap(10, composableLambda(%composer, <>, true) { it: @[ParameterName(name = 'x')] Int, %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<A(x)>:Test.kt")
+      val %dirty = %changed
+      if (%changed and 0b1110 == 0) {
+        %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
+      }
+      if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %dirty, -1, <>)
+        }
+        used(it)
+        A(x, 0, %composer, 0, 0b0010)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b00110110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, y, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithReturnValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithReturnValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..cbef791
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithReturnValue\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Int = 0, y: Int = 0): Int {
+    A(x, y)
+    return x + y
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x,>:Test.kt")
+  if (%default and 0b0001 != 0) {
+    x = 0
+  }
+  if (%default and 0b0010 != 0) {
+    y = 0
+  }
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(x, y, %composer, 0b1110 and %changed or 0b01110000 and %changed, 0)
+  val tmp0 = x + y
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithReturnValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithReturnValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..cbef791
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testComposableWithReturnValue\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Int = 0, y: Int = 0): Int {
+    A(x, y)
+    return x + y
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x,>:Test.kt")
+  if (%default and 0b0001 != 0) {
+    x = 0
+  }
+  if (%default and 0b0010 != 0) {
+    y = 0
+  }
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(x, y, %composer, 0b1110 and %changed or 0b01110000 and %changed, 0)
+  val tmp0 = x + y
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultSkipping\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultSkipping\133useFir = false\135.txt"
new file mode 100644
index 0000000..b39e593
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultSkipping\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(a: Int = newInt()) {
+   print(a)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = newInt()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(a)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultSkipping\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultSkipping\133useFir = true\135.txt"
new file mode 100644
index 0000000..b39e593
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultSkipping\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(a: Int = newInt()) {
+   print(a)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = newInt()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(a)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultsIssue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultsIssue\133useFir = false\135.txt"
new file mode 100644
index 0000000..8d2d815
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultsIssue\133useFir = false\135.txt"
@@ -0,0 +1,90 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.Dp
+
+@Composable
+fun Box2(
+    modifier: Modifier = Modifier,
+    paddingStart: Dp = Dp.Unspecified,
+    content: @Composable () -> Unit = {}
+) {
+    used(modifier)
+    used(paddingStart)
+    content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Box2(modifier: Modifier?, paddingStart: Dp, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Box2)P(1,2:c#ui.unit.Dp)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(paddingStart))) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      modifier = Companion
+    }
+    if (%default and 0b0010 != 0) {
+      paddingStart = Companion.Unspecified
+    }
+    if (%default and 0b0100 != 0) {
+      content = ComposableSingletons%TestKt.lambda-1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(modifier)
+    used(paddingStart)
+    content(%composer, 0b1110 and %dirty shr 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Box2(modifier, paddingStart, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultsIssue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultsIssue\133useFir = true\135.txt"
new file mode 100644
index 0000000..8d2d815
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDefaultsIssue\133useFir = true\135.txt"
@@ -0,0 +1,90 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.Dp
+
+@Composable
+fun Box2(
+    modifier: Modifier = Modifier,
+    paddingStart: Dp = Dp.Unspecified,
+    content: @Composable () -> Unit = {}
+) {
+    used(modifier)
+    used(paddingStart)
+    content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Box2(modifier: Modifier?, paddingStart: Dp, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Box2)P(1,2:c#ui.unit.Dp)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(paddingStart))) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      modifier = Companion
+    }
+    if (%default and 0b0010 != 0) {
+      paddingStart = Companion.Unspecified
+    }
+    if (%default and 0b0100 != 0) {
+      content = ComposableSingletons%TestKt.lambda-1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(modifier)
+    used(paddingStart)
+    content(%composer, 0b1110 and %dirty shr 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Box2(modifier, paddingStart, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDifferentParameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDifferentParameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..cb7af836
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDifferentParameters\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun A(x: Int) {
+    B(
+        // direct parameter
+        x,
+        // transformation
+        x + 1,
+        // literal
+        123,
+        // expression with no parameter
+        fooGlobal
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B(>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    B(x, x + 1, 123, fooGlobal, %composer, 0b110110000000 or 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDifferentParameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDifferentParameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..cb7af836
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testDifferentParameters\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun A(x: Int) {
+    B(
+        // direct parameter
+        x,
+        // transformation
+        x + 1,
+        // literal
+        123,
+        // expression with no parameter
+        fooGlobal
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B(>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    B(x, x + 1, 123, fooGlobal, %composer, 0b110110000000 or 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testExtensionReceiver\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testExtensionReceiver\133useFir = false\135.txt"
new file mode 100644
index 0000000..2f12ff2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testExtensionReceiver\133useFir = false\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun MaybeStable.example(x: Int) {
+    used(this)
+    used(x)
+}
+val example: @Composable MaybeStable.(Int) -> Unit = {
+    used(this)
+    used(it)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun MaybeStable.example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(example):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<this>)
+    used(x)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    example(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+val example: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: Int, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+    }
+    if (%changed and 0b01110000 == 0) {
+      %dirty = %dirty or if (%composer.changed(it)) 0b00100000 else 0b00010000
+    }
+    if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      used(<this>)
+      used(it)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testExtensionReceiver\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testExtensionReceiver\133useFir = true\135.txt"
new file mode 100644
index 0000000..2f12ff2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testExtensionReceiver\133useFir = true\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun MaybeStable.example(x: Int) {
+    used(this)
+    used(x)
+}
+val example: @Composable MaybeStable.(Int) -> Unit = {
+    used(this)
+    used(it)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun MaybeStable.example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(example):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<this>)
+    used(x)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    example(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+val example: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: Int, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+    }
+    if (%changed and 0b01110000 == 0) {
+      %dirty = %dirty or if (%composer.changed(it)) 0b00100000 else 0b00010000
+    }
+    if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      used(<this>)
+      used(it)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = false\135.txt"
new file mode 100644
index 0000000..ee19210
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = false\135.txt"
@@ -0,0 +1,93 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.material.Text
+import androidx.compose.ui.graphics.Color
+
+@Composable
+fun Button(colors: ButtonColors) {
+    Text("hello world", color = colors.getColor())
+}
+@Composable
+fun Test() {
+    Button {
+        if (condition()) Color.Red else Color.Blue
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
+fun Button(colors: ButtonColors, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Button)<getCol...>,<Text("...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(colors)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("hello world", null, colors.getColor(%composer, 0b1110 and %dirty), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0b0110, 0, 0b00011111111111111010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Button(colors, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Button>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Button(<block>{
+      class <no name provided> : ButtonColors {
+        @Composable
+        override fun getColor(%composer: Composer?, %changed: Int): Color {
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C(getColor)<condit...>:Test.kt")
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          val tmp0 = if (condition(%composer, 0)) {
+            Companion.Red
+          } else {
+            Companion.Blue
+          }
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+          %composer.endReplaceableGroup()
+          return tmp0
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = true\135.txt"
new file mode 100644
index 0000000..ee19210
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces2\133useFir = true\135.txt"
@@ -0,0 +1,93 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.material.Text
+import androidx.compose.ui.graphics.Color
+
+@Composable
+fun Button(colors: ButtonColors) {
+    Text("hello world", color = colors.getColor())
+}
+@Composable
+fun Test() {
+    Button {
+        if (condition()) Color.Red else Color.Blue
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
+fun Button(colors: ButtonColors, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Button)<getCol...>,<Text("...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(colors)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("hello world", null, colors.getColor(%composer, 0b1110 and %dirty), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0b0110, 0, 0b00011111111111111010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Button(colors, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Button>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Button(<block>{
+      class <no name provided> : ButtonColors {
+        @Composable
+        override fun getColor(%composer: Composer?, %changed: Int): Color {
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C(getColor)<condit...>:Test.kt")
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          val tmp0 = if (condition(%composer, 0)) {
+            Companion.Red
+          } else {
+            Companion.Blue
+          }
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+          %composer.endReplaceableGroup()
+          return tmp0
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces\133useFir = false\135.txt"
new file mode 100644
index 0000000..f4fd8c3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+fun Example(a: A) {
+    used(a)
+    Example { it -> a.compute(it) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun Example(a: A) {
+  used(a)
+  Example(<block>{
+    class <no name provided> : A {
+      @Composable
+      override fun compute(it: Int, %composer: Composer?, %changed: Int) {
+        %composer = %composer.startRestartGroup(<>)
+        sourceInformation(%composer, "C(compute)<comput...>:Test.kt")
+        val %dirty = %changed
+        if (%changed and 0b1110 == 0) {
+          %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
+        }
+        if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %dirty, -1, <>)
+          }
+          a.compute(it, %composer, 0b1110 and %dirty)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+        val tmp0_rcvr = <this>
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          tmp0_rcvr.compute(it, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+      }
+    }
+    <no name provided>()
+  })
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces\133useFir = true\135.txt"
new file mode 100644
index 0000000..f4fd8c3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testFunInterfaces\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+fun Example(a: A) {
+    used(a)
+    Example { it -> a.compute(it) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun Example(a: A) {
+  used(a)
+  Example(<block>{
+    class <no name provided> : A {
+      @Composable
+      override fun compute(it: Int, %composer: Composer?, %changed: Int) {
+        %composer = %composer.startRestartGroup(<>)
+        sourceInformation(%composer, "C(compute)<comput...>:Test.kt")
+        val %dirty = %changed
+        if (%changed and 0b1110 == 0) {
+          %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
+        }
+        if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %dirty, -1, <>)
+          }
+          a.compute(it, %composer, 0b1110 and %dirty)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+        val tmp0_rcvr = <this>
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          tmp0_rcvr.compute(it, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+      }
+    }
+    <no name provided>()
+  })
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testGrouplessProperty\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testGrouplessProperty\133useFir = false\135.txt"
new file mode 100644
index 0000000..3105d6d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testGrouplessProperty\133useFir = false\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.currentComposer
+
+open class Foo {
+    inline val current: Int
+        @Composable
+        @ReadOnlyComposable get() = currentComposer.hashCode()
+
+    @ReadOnlyComposable
+    @Composable
+    fun getHashCode(): Int = currentComposer.hashCode()
+}
+
+@ReadOnlyComposable
+@Composable
+fun getHashCode(): Int = currentComposer.hashCode()
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+open class Foo {
+  val current: Int
+    @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
+    get() {
+      sourceInformationMarkerStart(%composer, <>, "CC:Test.kt")
+      val tmp0 = %composer.hashCode()
+      sourceInformationMarkerEnd(%composer)
+      return tmp0
+    }
+  @ReadOnlyComposable
+  @Composable
+  fun getHashCode(%composer: Composer?, %changed: Int): Int {
+    sourceInformationMarkerStart(%composer, <>, "C(getHashCode):Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = %composer.hashCode()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp0
+  }
+  static val %stable: Int = 0
+}
+@ReadOnlyComposable
+@Composable
+fun getHashCode(%composer: Composer?, %changed: Int): Int {
+  sourceInformationMarkerStart(%composer, <>, "C(getHashCode):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = %composer.hashCode()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testGrouplessProperty\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testGrouplessProperty\133useFir = true\135.txt"
new file mode 100644
index 0000000..3105d6d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testGrouplessProperty\133useFir = true\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.currentComposer
+
+open class Foo {
+    inline val current: Int
+        @Composable
+        @ReadOnlyComposable get() = currentComposer.hashCode()
+
+    @ReadOnlyComposable
+    @Composable
+    fun getHashCode(): Int = currentComposer.hashCode()
+}
+
+@ReadOnlyComposable
+@Composable
+fun getHashCode(): Int = currentComposer.hashCode()
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+open class Foo {
+  val current: Int
+    @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
+    get() {
+      sourceInformationMarkerStart(%composer, <>, "CC:Test.kt")
+      val tmp0 = %composer.hashCode()
+      sourceInformationMarkerEnd(%composer)
+      return tmp0
+    }
+  @ReadOnlyComposable
+  @Composable
+  fun getHashCode(%composer: Composer?, %changed: Int): Int {
+    sourceInformationMarkerStart(%composer, <>, "C(getHashCode):Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = %composer.hashCode()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp0
+  }
+  static val %stable: Int = 0
+}
+@ReadOnlyComposable
+@Composable
+fun getHashCode(%composer: Composer?, %changed: Int): Int {
+  sourceInformationMarkerStart(%composer, <>, "C(getHashCode):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = %composer.hashCode()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testIfInLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testIfInLambda\133useFir = false\135.txt"
index 33a97f3..2ab906d 100644
--- "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testIfInLambda\133useFir = false\135.txt"
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testIfInLambda\133useFir = false\135.txt"
@@ -1,3 +1,7 @@
+//
+// Source
+// ------------------------------------------
+
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.NonRestartableComposable
 import androidx.compose.runtime.ReadOnlyComposable
@@ -15,9 +19,9 @@
     }
 }
 
-/********
- * TRANSFORMED
- ********/
+//
+// Transformed IR
+// ------------------------------------------
 
 @Composable
 fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int) {
@@ -54,12 +58,12 @@
         if (x > 0) {
           %composer.startReplaceableGroup(<>)
           sourceInformation(%composer, "<A(x)>")
-          A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
+          A(x, 0, %composer, 0, 0b0010)
           %composer.endReplaceableGroup()
         } else {
           %composer.startReplaceableGroup(<>)
           sourceInformation(%composer, "<A(x)>")
-          A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
+          A(x, 0, %composer, 0, 0b0010)
           %composer.endReplaceableGroup()
         }
         if (isTraceInProgress()) {
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testIfInLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testIfInLambda\133useFir = true\135.txt"
index 33a97f3..2ab906d 100644
--- "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testIfInLambda\133useFir = true\135.txt"
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testIfInLambda\133useFir = true\135.txt"
@@ -1,3 +1,7 @@
+//
+// Source
+// ------------------------------------------
+
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.NonRestartableComposable
 import androidx.compose.runtime.ReadOnlyComposable
@@ -15,9 +19,9 @@
     }
 }
 
-/********
- * TRANSFORMED
- ********/
+//
+// Transformed IR
+// ------------------------------------------
 
 @Composable
 fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int) {
@@ -54,12 +58,12 @@
         if (x > 0) {
           %composer.startReplaceableGroup(<>)
           sourceInformation(%composer, "<A(x)>")
-          A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
+          A(x, 0, %composer, 0, 0b0010)
           %composer.endReplaceableGroup()
         } else {
           %composer.startReplaceableGroup(<>)
           sourceInformation(%composer, "<A(x)>")
-          A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
+          A(x, 0, %composer, 0, 0b0010)
           %composer.endReplaceableGroup()
         }
         if (isTraceInProgress()) {
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testInlineClassDefaultParameter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testInlineClassDefaultParameter\133useFir = false\135.txt"
new file mode 100644
index 0000000..3298250
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testInlineClassDefaultParameter\133useFir = false\135.txt"
@@ -0,0 +1,81 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun A(text: String) {
+    B(text)
+}
+
+@Composable
+fun B(text: String, color: Color = Color.Unset) {
+    used(text)
+    used(color)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(text: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B(text...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    B(text, <unsafe-coerce>(0), %composer, 0b1110 and %dirty, 0b0010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(text, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(text: String, color: Color, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B)P(1,0:Color):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(color))) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0010 != 0) {
+      color = Companion.Unset
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(text)
+    used(color)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(text, color, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testInlineClassDefaultParameter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testInlineClassDefaultParameter\133useFir = true\135.txt"
new file mode 100644
index 0000000..3298250
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testInlineClassDefaultParameter\133useFir = true\135.txt"
@@ -0,0 +1,81 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun A(text: String) {
+    B(text)
+}
+
+@Composable
+fun B(text: String, color: Color = Color.Unset) {
+    used(text)
+    used(color)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(text: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B(text...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    B(text, <unsafe-coerce>(0), %composer, 0b1110 and %dirty, 0b0010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(text, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(text: String, color: Color, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B)P(1,0:Color):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(color))) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0010 != 0) {
+      color = Companion.Unset
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(text)
+    used(color)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(text, color, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLambdaSkipping\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLambdaSkipping\133useFir = false\135.txt"
new file mode 100644
index 0000000..83c9a6c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLambdaSkipping\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+fun LazyListScope.Example(items: LazyPagingItems<User>) {
+    itemsIndexed(items) { index, user ->
+        print("Hello World")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun LazyListScope.Example(items: LazyPagingItems<User>) {
+  itemsIndexed(items, ComposableSingletons%TestKt.lambda-1)
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: @[ExtensionFunctionType] Function5<LazyItemScope, Int, User?, Composer, Int, Unit> = composableLambdaInstance(<>, false) { index: Int, user: User?, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b0001010000000001 != 0b010000000000 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      print("Hello World")
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLambdaSkipping\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLambdaSkipping\133useFir = true\135.txt"
new file mode 100644
index 0000000..83c9a6c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLambdaSkipping\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+fun LazyListScope.Example(items: LazyPagingItems<User>) {
+    itemsIndexed(items) { index, user ->
+        print("Hello World")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun LazyListScope.Example(items: LazyPagingItems<User>) {
+  itemsIndexed(items, ComposableSingletons%TestKt.lambda-1)
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: @[ExtensionFunctionType] Function5<LazyItemScope, Int, User?, Composer, Int, Unit> = composableLambdaInstance(<>, false) { index: Int, user: User?, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b0001010000000001 != 0b010000000000 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      print("Hello World")
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalComposableFunctions\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalComposableFunctions\133useFir = false\135.txt"
new file mode 100644
index 0000000..bbd5212
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalComposableFunctions\133useFir = false\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(a: Int) {
+    @Composable fun Inner() {
+        A(a)
+    }
+    Inner()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<Inner(...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    @Composable
+    fun Inner(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Inner)<A(a)>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      A(a, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    Inner(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalComposableFunctions\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalComposableFunctions\133useFir = true\135.txt"
new file mode 100644
index 0000000..bbd5212
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalComposableFunctions\133useFir = true\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(a: Int) {
+    @Composable fun Inner() {
+        A(a)
+    }
+    Inner()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<Inner(...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    @Composable
+    fun Inner(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Inner)<A(a)>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      A(a, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    Inner(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalFunction\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalFunction\133useFir = false\135.txt"
new file mode 100644
index 0000000..74a928e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalFunction\133useFir = false\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun A(x: Int) {
+    @Composable fun foo(y: Int) {
+        B(x, y)
+    }
+    foo(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<foo(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    @Composable
+    fun foo(y: Int, %composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(foo)<B(x,>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      B(x, y, %composer, 0b01110000 and %changed shl 0b0011)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    foo(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalFunction\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalFunction\133useFir = true\135.txt"
new file mode 100644
index 0000000..74a928e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLocalFunction\133useFir = true\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun A(x: Int) {
+    @Composable fun foo(y: Int) {
+        B(x, y)
+    }
+    foo(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<foo(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    @Composable
+    fun foo(y: Int, %composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(foo)<B(x,>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      B(x, y, %composer, 0b01110000 and %changed shl 0b0011)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    foo(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLoopWithContinueAndCallAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLoopWithContinueAndCallAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..628d59d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLoopWithContinueAndCallAfter\133useFir = false\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+@NonRestartableComposable
+fun Example() {
+    Call()
+    for (index in 0..1) {
+        Call()
+        if (condition())
+            continue
+        Call()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<Call()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Call(%composer, 0)
+  val <iterator> = 0 .. 1.iterator()
+  while (<iterator>.hasNext()) {
+    val index = <iterator>.next()
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<Call()>,<Call()>")
+    Call(%composer, 0)
+    if (condition()) {
+      %composer.endReplaceableGroup()
+      continue
+    }
+    Call(%composer, 0)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLoopWithContinueAndCallAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLoopWithContinueAndCallAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..628d59d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testLoopWithContinueAndCallAfter\133useFir = true\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+@NonRestartableComposable
+fun Example() {
+    Call()
+    for (index in 0..1) {
+        Call()
+        if (condition())
+            continue
+        Call()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example)<Call()>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  Call(%composer, 0)
+  val <iterator> = 0 .. 1.iterator()
+  while (<iterator>.hasNext()) {
+    val index = <iterator>.next()
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<Call()>,<Call()>")
+    Call(%composer, 0)
+    if (condition()) {
+      %composer.endReplaceableGroup()
+      continue
+    }
+    Call(%composer, 0)
+    %composer.endReplaceableGroup()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testManyNonOptionalParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testManyNonOptionalParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..ed3c95a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testManyNonOptionalParams\133useFir = false\135.txt"
@@ -0,0 +1,78 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(a: Int, b: Boolean, c: Int = 0, d: Foo = Foo(), e: List<Int> = emptyList()) {
+    A(a, b, c, d, e)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Boolean, c: Int, d: Foo?, e: List<Int>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(a,>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%default and 0b1000 == 0 && %composer.changed(d)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0010000000000000
+  }
+  if (%default and 0b00010000 != 0b00010000 || %dirty and 0b1011011011011011 != 0b0010010010010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0100 != 0) {
+        c = 0
+      }
+      if (%default and 0b1000 != 0) {
+        d = Foo()
+        %dirty = %dirty and 0b0001110000000000.inv()
+      }
+      if (%default and 0b00010000 != 0) {
+        e = emptyList()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b1000 != 0) {
+        %dirty = %dirty and 0b0001110000000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(a, b, c, d, e, %composer, 0b1000000000000000 or 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, d, e, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testManyNonOptionalParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testManyNonOptionalParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..ed3c95a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testManyNonOptionalParams\133useFir = true\135.txt"
@@ -0,0 +1,78 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(a: Int, b: Boolean, c: Int = 0, d: Foo = Foo(), e: List<Int> = emptyList()) {
+    A(a, b, c, d, e)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Boolean, c: Int, d: Foo?, e: List<Int>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(a,>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%default and 0b1000 == 0 && %composer.changed(d)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0010000000000000
+  }
+  if (%default and 0b00010000 != 0b00010000 || %dirty and 0b1011011011011011 != 0b0010010010010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0100 != 0) {
+        c = 0
+      }
+      if (%default and 0b1000 != 0) {
+        d = Foo()
+        %dirty = %dirty and 0b0001110000000000.inv()
+      }
+      if (%default and 0b00010000 != 0) {
+        e = emptyList()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b1000 != 0) {
+        %dirty = %dirty and 0b0001110000000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(a, b, c, d, e, %composer, 0b1000000000000000 or 0b1110 and %dirty or 0b01110000 and %dirty or 0b001110000000 and %dirty or 0b0001110000000000 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, d, e, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNestedCalls\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNestedCalls\133useFir = false\135.txt"
new file mode 100644
index 0000000..2a745d94
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNestedCalls\133useFir = false\135.txt"
@@ -0,0 +1,83 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun A(x: Int) {
+    Provide { y ->
+        Provide { z ->
+            B(x, y, z)
+        }
+        B(x, y)
+    }
+    B(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<Provid...>,<B(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Provide(composableLambda(%composer, <>, true) { y: Int, %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Provid...>,<B(x,>:Test.kt")
+      val %dirty = %changed
+      if (%changed and 0b1110 == 0) {
+        %dirty = %dirty or if (%composer.changed(y)) 0b0100 else 0b0010
+      }
+      if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %dirty, -1, <>)
+        }
+        Provide(composableLambda(%composer, <>, true) { z: Int, %composer: Composer?, %changed: Int ->
+          sourceInformation(%composer, "C<B(x,>:Test.kt")
+          val %dirty = %changed
+          if (%changed and 0b1110 == 0) {
+            %dirty = %dirty or if (%composer.changed(z)) 0b0100 else 0b0010
+          }
+          if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %dirty, -1, <>)
+            }
+            B(x, y, z, %composer, 0b001110000000 and %dirty shl 0b0110, 0)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+        }, %composer, 0b0110)
+        B(x, y, 0, %composer, 0b01110000 and %dirty shl 0b0011, 0b0100)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b0110)
+    B(x, 0, 0, %composer, 0b1110 and %dirty, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNestedCalls\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNestedCalls\133useFir = true\135.txt"
new file mode 100644
index 0000000..2a745d94
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNestedCalls\133useFir = true\135.txt"
@@ -0,0 +1,83 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun A(x: Int) {
+    Provide { y ->
+        Provide { z ->
+            B(x, y, z)
+        }
+        B(x, y)
+    }
+    B(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<Provid...>,<B(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Provide(composableLambda(%composer, <>, true) { y: Int, %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Provid...>,<B(x,>:Test.kt")
+      val %dirty = %changed
+      if (%changed and 0b1110 == 0) {
+        %dirty = %dirty or if (%composer.changed(y)) 0b0100 else 0b0010
+      }
+      if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %dirty, -1, <>)
+        }
+        Provide(composableLambda(%composer, <>, true) { z: Int, %composer: Composer?, %changed: Int ->
+          sourceInformation(%composer, "C<B(x,>:Test.kt")
+          val %dirty = %changed
+          if (%changed and 0b1110 == 0) {
+            %dirty = %dirty or if (%composer.changed(z)) 0b0100 else 0b0010
+          }
+          if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %dirty, -1, <>)
+            }
+            B(x, y, z, %composer, 0b001110000000 and %dirty shl 0b0110, 0)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+        }, %composer, 0b0110)
+        B(x, y, 0, %composer, 0b01110000 and %dirty shl 0b0011, 0b0100)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b0110)
+    B(x, 0, 0, %composer, 0b1110 and %dirty, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNoParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNoParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..15e0d3f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNoParams\133useFir = false\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test() {
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNoParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNoParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..15e0d3f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testNoParams\133useFir = true\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test() {
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testOptionalUnstableWithStableExtensionReceiver\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testOptionalUnstableWithStableExtensionReceiver\133useFir = false\135.txt"
new file mode 100644
index 0000000..a13798a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testOptionalUnstableWithStableExtensionReceiver\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Bar.CanSkip(b: Foo = Foo()) {
+    print("Hello World")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Bar.CanSkip(b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CanSkip):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0b0001 || %dirty and 0b0001 != 0 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        b = Foo()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print("Hello World")
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CanSkip(b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testOptionalUnstableWithStableExtensionReceiver\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testOptionalUnstableWithStableExtensionReceiver\133useFir = true\135.txt"
new file mode 100644
index 0000000..a13798a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testOptionalUnstableWithStableExtensionReceiver\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Bar.CanSkip(b: Foo = Foo()) {
+    print("Hello World")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Bar.CanSkip(b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CanSkip):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0b0001 || %dirty and 0b0001 != 0 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        b = Foo()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print("Hello World")
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CanSkip(b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testParamReordering\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testParamReordering\133useFir = false\135.txt"
new file mode 100644
index 0000000..afb7f4a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testParamReordering\133useFir = false\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Test(x: Int, y: Int) {
+    A(y = y, x = x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(y>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, y, %composer, 0b1110 and %dirty or 0b01110000 and %dirty, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, y, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testParamReordering\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testParamReordering\133useFir = true\135.txt"
new file mode 100644
index 0000000..afb7f4a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testParamReordering\133useFir = true\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Test(x: Int, y: Int) {
+    A(y = y, x = x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(y>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(y)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, y, %composer, 0b1110 and %dirty or 0b01110000 and %dirty, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, y, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPassedExtensionWhenExtensionIsPotentiallyUnstable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPassedExtensionWhenExtensionIsPotentiallyUnstable\133useFir = false\135.txt"
new file mode 100644
index 0000000..3c659c1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPassedExtensionWhenExtensionIsPotentiallyUnstable\133useFir = false\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Unstable.Test() {
+    doSomething(this) // does this reference %dirty without %dirty
+}
+
+@Composable fun doSomething(x: Unstable) {}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Unstable.Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<doSome...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    doSomething(<this>, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun doSomething(x: Unstable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(doSomething):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    doSomething(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPassedExtensionWhenExtensionIsPotentiallyUnstable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPassedExtensionWhenExtensionIsPotentiallyUnstable\133useFir = true\135.txt"
new file mode 100644
index 0000000..3c659c1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPassedExtensionWhenExtensionIsPotentiallyUnstable\133useFir = true\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun Unstable.Test() {
+    doSomething(this) // does this reference %dirty without %dirty
+}
+
+@Composable fun doSomething(x: Unstable) {}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Unstable.Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<doSome...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    doSomething(<this>, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun doSomething(x: Unstable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(doSomething):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    doSomething(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPrimitiveVarargParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPrimitiveVarargParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..98e5aca
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPrimitiveVarargParams\133useFir = false\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun B(vararg values: Int) {
+    print(values)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun B(values: IntArray, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, values.size)
+  val <iterator> = values.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(values)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(*values, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPrimitiveVarargParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPrimitiveVarargParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..98e5aca
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testPrimitiveVarargParams\133useFir = true\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun B(vararg values: Int) {
+    print(values)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun B(values: IntArray, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, values.size)
+  val <iterator> = values.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(values)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(*values, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverIssue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverIssue\133useFir = false\135.txt"
new file mode 100644
index 0000000..b485767
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverIssue\133useFir = false\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.ExplicitGroupsComposable
+
+@Composable
+@ExplicitGroupsComposable
+fun A(foo: Foo) {
+    foo.b()
+}
+
+@Composable
+@ExplicitGroupsComposable
+inline fun Foo.b(label: String = "") {
+    c(this, label)
+}
+
+@Composable
+@ExplicitGroupsComposable
+inline fun c(foo: Foo, label: String) {
+    print(label)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ExplicitGroupsComposable
+fun A(foo: Foo, %composer: Composer?, %changed: Int) {
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  foo.b(null, %composer, 0b1110 and %changed, 0b0001)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+}
+@Composable
+@ExplicitGroupsComposable
+fun Foo.b(label: String?, %composer: Composer?, %changed: Int, %default: Int) {
+  if (%default and 0b0001 != 0) {
+    label = ""
+  }
+  c(<this>, label, %composer, 0b1110 and %changed or 0b01110000 and %changed)
+}
+@Composable
+@ExplicitGroupsComposable
+fun c(foo: Foo, label: String, %composer: Composer?, %changed: Int) {
+  print(label)
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverIssue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverIssue\133useFir = true\135.txt"
new file mode 100644
index 0000000..b485767
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverIssue\133useFir = true\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.ExplicitGroupsComposable
+
+@Composable
+@ExplicitGroupsComposable
+fun A(foo: Foo) {
+    foo.b()
+}
+
+@Composable
+@ExplicitGroupsComposable
+inline fun Foo.b(label: String = "") {
+    c(this, label)
+}
+
+@Composable
+@ExplicitGroupsComposable
+inline fun c(foo: Foo, label: String) {
+    print(label)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ExplicitGroupsComposable
+fun A(foo: Foo, %composer: Composer?, %changed: Int) {
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  foo.b(null, %composer, 0b1110 and %changed, 0b0001)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+}
+@Composable
+@ExplicitGroupsComposable
+fun Foo.b(label: String?, %composer: Composer?, %changed: Int, %default: Int) {
+  if (%default and 0b0001 != 0) {
+    label = ""
+  }
+  c(<this>, label, %composer, 0b1110 and %changed or 0b01110000 and %changed)
+}
+@Composable
+@ExplicitGroupsComposable
+fun c(foo: Foo, label: String, %composer: Composer?, %changed: Int) {
+  print(label)
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverLambdaCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverLambdaCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..b3df740
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverLambdaCall\133useFir = false\135.txt"
@@ -0,0 +1,94 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+val unstableUnused: @Composable Foo.() -> Unit = {
+}
+val unstableUsed: @Composable Foo.() -> Unit = {
+    used(x)
+}
+val stableUnused: @Composable StableFoo.() -> Unit = {
+}
+val stableUsed: @Composable StableFoo.() -> Unit = {
+    used(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val unstableUnused: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+val unstableUsed: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-2
+val stableUnused: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-3
+val stableUsed: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-4
+internal object ComposableSingletons%TestKt {
+  val lambda-1: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-2: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      used(<this>.x)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-3: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-4: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      used(<this>.x)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverLambdaCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverLambdaCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..b976185
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverLambdaCall\133useFir = true\135.txt"
@@ -0,0 +1,94 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+val unstableUnused: @Composable Foo.() -> Unit = {
+}
+val unstableUsed: @Composable Foo.() -> Unit = {
+    used(x)
+}
+val stableUnused: @Composable StableFoo.() -> Unit = {
+}
+val stableUsed: @Composable StableFoo.() -> Unit = {
+    used(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val unstableUnused: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+val unstableUsed: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-2
+val stableUnused: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-3
+val stableUsed: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-4
+internal object ComposableSingletons%TestKt {
+  val lambda-1: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-2: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      used(x)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-3: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-4: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    val %dirty = %changed
+    if (%changed and 0b1110 == 0) {
+      %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      used(x)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverParamSkippability\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverParamSkippability\133useFir = false\135.txt"
new file mode 100644
index 0000000..e694ebe
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverParamSkippability\133useFir = false\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+class Foo {
+ var counter: Int = 0
+ @Composable fun A() {
+    print("hello world")
+ }
+ @Composable fun B() {
+    print(counter)
+ }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  var counter: Int = 0
+  @Composable
+  fun A(%composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(A):Test.kt")
+    if (%changed and 0b0001 != 0 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      print("hello world")
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.A(%composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  @Composable
+  fun B(%composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(B):Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    print(counter)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.B(%composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 8
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverParamSkippability\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverParamSkippability\133useFir = true\135.txt"
new file mode 100644
index 0000000..e694ebe
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testReceiverParamSkippability\133useFir = true\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+class Foo {
+ var counter: Int = 0
+ @Composable fun A() {
+    print("hello world")
+ }
+ @Composable fun B() {
+    print(counter)
+ }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Foo {
+  var counter: Int = 0
+  @Composable
+  fun A(%composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(A):Test.kt")
+    if (%changed and 0b0001 != 0 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      print("hello world")
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.A(%composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  @Composable
+  fun B(%composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(B):Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    print(counter)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.B(%composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 8
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testRecursiveCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testRecursiveCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..0ace20a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testRecursiveCall\133useFir = false\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun X(x: Int) {
+    X(x + 1)
+    X(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun X(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(X)<X(x>,<X(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    X(x + 1, %composer, 0)
+    X(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    X(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testRecursiveCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testRecursiveCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..0ace20a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testRecursiveCall\133useFir = true\135.txt"
@@ -0,0 +1,43 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun X(x: Int) {
+    X(x + 1)
+    X(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun X(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(X)<X(x>,<X(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    X(x + 1, %composer, 0)
+    X(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    X(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSiblingIfsWithoutElseHaveUniqueKeys\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSiblingIfsWithoutElseHaveUniqueKeys\133useFir = false\135.txt"
new file mode 100644
index 0000000..faf99be
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSiblingIfsWithoutElseHaveUniqueKeys\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(cond: Boolean) {
+    if (cond) {
+        A()
+    }
+    if (cond) {
+        B()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(cond: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<B()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(cond)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<A()>")
+    if (cond) {
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    if (cond) {
+      B(%composer, 0)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(cond, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSiblingIfsWithoutElseHaveUniqueKeys\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSiblingIfsWithoutElseHaveUniqueKeys\133useFir = true\135.txt"
new file mode 100644
index 0000000..faf99be
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSiblingIfsWithoutElseHaveUniqueKeys\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(cond: Boolean) {
+    if (cond) {
+        A()
+    }
+    if (cond) {
+        B()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(cond: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<B()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(cond)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<A()>")
+    if (cond) {
+      A(%composer, 0)
+    }
+    %composer.endReplaceableGroup()
+    if (cond) {
+      B(%composer, 0)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(cond, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBoxWithShape\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBoxWithShape\133useFir = false\135.txt"
new file mode 100644
index 0000000..fbef31c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBoxWithShape\133useFir = false\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun SimpleBox(modifier: Modifier = Modifier, shape: Shape = RectangleShape) {
+    used(modifier)
+    used(shape)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun SimpleBox(modifier: Modifier?, shape: Shape?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SimpleBox):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(shape)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        modifier = Companion
+      }
+      if (%default and 0b0010 != 0) {
+        shape = RectangleShape
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(modifier)
+    used(shape)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SimpleBox(modifier, shape, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBoxWithShape\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBoxWithShape\133useFir = true\135.txt"
new file mode 100644
index 0000000..fbef31c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBoxWithShape\133useFir = true\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun SimpleBox(modifier: Modifier = Modifier, shape: Shape = RectangleShape) {
+    used(modifier)
+    used(shape)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun SimpleBox(modifier: Modifier?, shape: Shape?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SimpleBox):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(shape)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        modifier = Companion
+      }
+      if (%default and 0b0010 != 0) {
+        shape = RectangleShape
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(modifier)
+    used(shape)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SimpleBox(modifier, shape, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBox\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBox\133useFir = false\135.txt"
new file mode 100644
index 0000000..ccb90fe
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBox\133useFir = false\135.txt"
@@ -0,0 +1,73 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun SimpleBox(modifier: Modifier = Modifier, content: @Composable() () -> Unit = {}) {
+    used(modifier)
+    content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun SimpleBox(modifier: Modifier?, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SimpleBox)P(1)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      modifier = Companion
+    }
+    if (%default and 0b0010 != 0) {
+      content = ComposableSingletons%TestKt.lambda-1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(modifier)
+    content(%composer, 0b1110 and %dirty shr 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SimpleBox(modifier, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBox\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBox\133useFir = true\135.txt"
new file mode 100644
index 0000000..ccb90fe
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleBox\133useFir = true\135.txt"
@@ -0,0 +1,73 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun SimpleBox(modifier: Modifier = Modifier, content: @Composable() () -> Unit = {}) {
+    used(modifier)
+    content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun SimpleBox(modifier: Modifier?, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SimpleBox)P(1)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      modifier = Companion
+    }
+    if (%default and 0b0010 != 0) {
+      content = ComposableSingletons%TestKt.lambda-1
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(modifier)
+    content(%composer, 0b1110 and %dirty shr 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SimpleBox(modifier, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleColumn\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleColumn\133useFir = false\135.txt"
new file mode 100644
index 0000000..d3c3c8f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleColumn\133useFir = false\135.txt"
@@ -0,0 +1,167 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun RowColumnImpl(
+  orientation: LayoutOrientation,
+  modifier: Modifier = Modifier,
+  arrangement: Arrangement.Vertical = Arrangement.Top,
+  crossAxisAlignment: Alignment.Horizontal = Alignment.Start,
+  crossAxisSize: SizeMode = SizeMode.Wrap,
+  content: @Composable() ()->Unit
+) {
+    used(orientation)
+    used(modifier)
+    used(arrangement)
+    used(crossAxisAlignment)
+    used(crossAxisSize)
+    content()
+}
+
+@Composable
+fun Column(
+    modifier: Modifier = Modifier,
+    verticalArrangement: Arrangement.Vertical = Arrangement.Top,
+    horizontalGravity: Alignment.Horizontal = Alignment.Start,
+    content: @Composable() ()->Unit
+) {
+  RowColumnImpl(
+    orientation = LayoutOrientation.Vertical,
+    arrangement = verticalArrangement,
+    crossAxisAlignment = horizontalGravity,
+    crossAxisSize = SizeMode.Wrap,
+    modifier = modifier,
+    content = content
+  )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun RowColumnImpl(orientation: LayoutOrientation, modifier: Modifier?, arrangement: Vertical?, crossAxisAlignment: Horizontal?, crossAxisSize: SizeMode?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(RowColumnImpl)P(5,4!1,2,3)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(orientation)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(arrangement)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(crossAxisAlignment)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(crossAxisSize)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%dirty and 0b01011011011011011011 != 0b00010010010010010010 || !%composer.skipping) {
+    if (%default and 0b0010 != 0) {
+      modifier = Companion
+    }
+    if (%default and 0b0100 != 0) {
+      arrangement = Top
+    }
+    if (%default and 0b1000 != 0) {
+      crossAxisAlignment = Companion.Start
+    }
+    if (%default and 0b00010000 != 0) {
+      crossAxisSize = SizeMode.Wrap
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(orientation)
+    used(modifier)
+    used(arrangement)
+    used(crossAxisAlignment)
+    used(crossAxisSize)
+    content(%composer, 0b1110 and %dirty shr 0b1111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    RowColumnImpl(orientation, modifier, arrangement, crossAxisAlignment, crossAxisSize, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Column(modifier: Modifier?, verticalArrangement: Vertical?, horizontalGravity: Horizontal?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Column)P(2,3,1)<RowCol...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(verticalArrangement)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(horizontalGravity)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      modifier = Companion
+    }
+    if (%default and 0b0010 != 0) {
+      verticalArrangement = Top
+    }
+    if (%default and 0b0100 != 0) {
+      horizontalGravity = Companion.Start
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val tmp0_orientation = LayoutOrientation.Vertical
+    val tmp1_crossAxisSize = SizeMode.Wrap
+    RowColumnImpl(tmp0_orientation, modifier, verticalArrangement, horizontalGravity, tmp1_crossAxisSize, content, %composer, 0b0110000000000110 or 0b01110000 and %dirty shl 0b0011 or 0b001110000000 and %dirty shl 0b0011 or 0b0001110000000000 and %dirty shl 0b0011 or 0b01110000000000000000 and %dirty shl 0b0110, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Column(modifier, verticalArrangement, horizontalGravity, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleColumn\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleColumn\133useFir = true\135.txt"
new file mode 100644
index 0000000..d3c3c8f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimpleColumn\133useFir = true\135.txt"
@@ -0,0 +1,167 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun RowColumnImpl(
+  orientation: LayoutOrientation,
+  modifier: Modifier = Modifier,
+  arrangement: Arrangement.Vertical = Arrangement.Top,
+  crossAxisAlignment: Alignment.Horizontal = Alignment.Start,
+  crossAxisSize: SizeMode = SizeMode.Wrap,
+  content: @Composable() ()->Unit
+) {
+    used(orientation)
+    used(modifier)
+    used(arrangement)
+    used(crossAxisAlignment)
+    used(crossAxisSize)
+    content()
+}
+
+@Composable
+fun Column(
+    modifier: Modifier = Modifier,
+    verticalArrangement: Arrangement.Vertical = Arrangement.Top,
+    horizontalGravity: Alignment.Horizontal = Alignment.Start,
+    content: @Composable() ()->Unit
+) {
+  RowColumnImpl(
+    orientation = LayoutOrientation.Vertical,
+    arrangement = verticalArrangement,
+    crossAxisAlignment = horizontalGravity,
+    crossAxisSize = SizeMode.Wrap,
+    modifier = modifier,
+    content = content
+  )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun RowColumnImpl(orientation: LayoutOrientation, modifier: Modifier?, arrangement: Vertical?, crossAxisAlignment: Horizontal?, crossAxisSize: SizeMode?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(RowColumnImpl)P(5,4!1,2,3)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(orientation)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(arrangement)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(crossAxisAlignment)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(crossAxisSize)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%dirty and 0b01011011011011011011 != 0b00010010010010010010 || !%composer.skipping) {
+    if (%default and 0b0010 != 0) {
+      modifier = Companion
+    }
+    if (%default and 0b0100 != 0) {
+      arrangement = Top
+    }
+    if (%default and 0b1000 != 0) {
+      crossAxisAlignment = Companion.Start
+    }
+    if (%default and 0b00010000 != 0) {
+      crossAxisSize = SizeMode.Wrap
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(orientation)
+    used(modifier)
+    used(arrangement)
+    used(crossAxisAlignment)
+    used(crossAxisSize)
+    content(%composer, 0b1110 and %dirty shr 0b1111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    RowColumnImpl(orientation, modifier, arrangement, crossAxisAlignment, crossAxisSize, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Column(modifier: Modifier?, verticalArrangement: Vertical?, horizontalGravity: Horizontal?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Column)P(2,3,1)<RowCol...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(verticalArrangement)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(horizontalGravity)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      modifier = Companion
+    }
+    if (%default and 0b0010 != 0) {
+      verticalArrangement = Top
+    }
+    if (%default and 0b0100 != 0) {
+      horizontalGravity = Companion.Start
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val tmp0_orientation = LayoutOrientation.Vertical
+    val tmp1_crossAxisSize = SizeMode.Wrap
+    RowColumnImpl(tmp0_orientation, modifier, verticalArrangement, horizontalGravity, tmp1_crossAxisSize, content, %composer, 0b0110000000000110 or 0b01110000 and %dirty shl 0b0011 or 0b001110000000 and %dirty shl 0b0011 or 0b0001110000000000 and %dirty shl 0b0011 or 0b01110000000000000000 and %dirty shl 0b0110, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Column(modifier, verticalArrangement, horizontalGravity, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimplerBox\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimplerBox\133useFir = false\135.txt"
new file mode 100644
index 0000000..547c1b3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimplerBox\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun SimpleBox(modifier: Modifier = Modifier) {
+   used(modifier)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun SimpleBox(modifier: Modifier?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SimpleBox):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      modifier = Companion
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(modifier)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SimpleBox(modifier, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimplerBox\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimplerBox\133useFir = true\135.txt"
new file mode 100644
index 0000000..547c1b3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSimplerBox\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun SimpleBox(modifier: Modifier = Modifier) {
+   used(modifier)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun SimpleBox(modifier: Modifier?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SimpleBox):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      modifier = Companion
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(modifier)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SimpleBox(modifier, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithComposableDefault\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithComposableDefault\133useFir = false\135.txt"
new file mode 100644
index 0000000..a42e379
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithComposableDefault\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Int = I()) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<I()>,<A(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        x = I(%composer, 0)
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithComposableDefault\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithComposableDefault\133useFir = true\135.txt"
new file mode 100644
index 0000000..a42e379
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithComposableDefault\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Int = I()) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<I()>,<A(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        x = I(%composer, 0)
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithDefault\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithDefault\133useFir = false\135.txt"
new file mode 100644
index 0000000..48bdb7c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithDefault\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Int = 0) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      x = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithDefault\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithDefault\133useFir = true\135.txt"
new file mode 100644
index 0000000..48bdb7c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParamWithDefault\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Int = 0) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      x = 0
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..b65366d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParam\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Int) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..b65366d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleStableParam\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Int) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParamWithDefault\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParamWithDefault\133useFir = false\135.txt"
new file mode 100644
index 0000000..b3491d9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParamWithDefault\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo = Foo()) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        x = Foo()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParamWithDefault\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParamWithDefault\133useFir = true\135.txt"
new file mode 100644
index 0000000..b3491d9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParamWithDefault\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo = Foo()) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        x = Foo()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..388b7bd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParam\133useFir = false\135.txt"
@@ -0,0 +1,33 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(x, %composer, 0b1000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..388b7bd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testSingleUnstableParam\133useFir = true\135.txt"
@@ -0,0 +1,33 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(x, %composer, 0b1000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableUnstableParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableUnstableParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..78dec06
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableUnstableParams\133useFir = false\135.txt"
@@ -0,0 +1,107 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun CanSkip(a: Int = 0, b: Foo = Foo()) {
+    used(a)
+    used(b)
+}
+@Composable fun CannotSkip(a: Int, b: Foo) {
+    used(a)
+    used(b)
+    print("Hello World")
+}
+@Composable fun NoParams() {
+    print("Hello World")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun CanSkip(a: Int, b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CanSkip):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00010000
+  }
+  if (%default and 0b0010 != 0b0010 || %dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 0
+      }
+      if (%default and 0b0010 != 0) {
+        b = Foo()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CanSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun CannotSkip(a: Int, b: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CannotSkip):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(a)
+  used(b)
+  print("Hello World")
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CannotSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun NoParams(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(NoParams):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    print("Hello World")
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    NoParams(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableUnstableParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableUnstableParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..78dec06
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableUnstableParams\133useFir = true\135.txt"
@@ -0,0 +1,107 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun CanSkip(a: Int = 0, b: Foo = Foo()) {
+    used(a)
+    used(b)
+}
+@Composable fun CannotSkip(a: Int, b: Foo) {
+    used(a)
+    used(b)
+    print("Hello World")
+}
+@Composable fun NoParams() {
+    print("Hello World")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun CanSkip(a: Int, b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CanSkip):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00010000
+  }
+  if (%default and 0b0010 != 0b0010 || %dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 0
+      }
+      if (%default and 0b0010 != 0) {
+        b = Foo()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CanSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun CannotSkip(a: Int, b: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CannotSkip):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(a)
+  used(b)
+  print("Hello World")
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CannotSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun NoParams(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(NoParams):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    print("Hello World")
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    NoParams(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableVarargParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableVarargParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..01b138d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableVarargParams\133useFir = false\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun B(vararg values: Foo) {
+    print(values)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun B(values: Array<out Foo>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, values.size)
+  val <iterator> = values.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(values)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(*values, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableVarargParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableVarargParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..01b138d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStableVarargParams\133useFir = true\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun B(vararg values: Foo) {
+    print(values)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun B(values: Array<out Foo>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, values.size)
+  val <iterator> = values.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    print(values)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(*values, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticAndNonStaticDefaultValueSkipping\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticAndNonStaticDefaultValueSkipping\133useFir = false\135.txt"
new file mode 100644
index 0000000..99abdd3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticAndNonStaticDefaultValueSkipping\133useFir = false\135.txt"
@@ -0,0 +1,67 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(
+    wontChange: Int = 123,
+    mightChange: Int = LocalColor.current
+) {
+    A(wontChange)
+    A(mightChange)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(wontChange: Int, mightChange: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)P(1)<curren...>,<A(wont...>,<A(migh...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(wontChange)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(mightChange)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        wontChange = 123
+      }
+      if (%default and 0b0010 != 0) {
+        mightChange = LocalColor.<get-current>(%composer, 0b0110)
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(wontChange, %composer, 0b1110 and %dirty)
+    A(mightChange, %composer, 0b1110 and %dirty shr 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(wontChange, mightChange, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticAndNonStaticDefaultValueSkipping\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticAndNonStaticDefaultValueSkipping\133useFir = true\135.txt"
new file mode 100644
index 0000000..99abdd3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticAndNonStaticDefaultValueSkipping\133useFir = true\135.txt"
@@ -0,0 +1,67 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Example(
+    wontChange: Int = 123,
+    mightChange: Int = LocalColor.current
+) {
+    A(wontChange)
+    A(mightChange)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(wontChange: Int, mightChange: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)P(1)<curren...>,<A(wont...>,<A(migh...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(wontChange)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(mightChange)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        wontChange = 123
+      }
+      if (%default and 0b0010 != 0) {
+        mightChange = LocalColor.<get-current>(%composer, 0b0110)
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(wontChange, %composer, 0b1110 and %dirty)
+    A(mightChange, %composer, 0b1110 and %dirty shr 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(wontChange, mightChange, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticDetection\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticDetection\133useFir = false\135.txt"
new file mode 100644
index 0000000..e10b4f6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticDetection\133useFir = false\135.txt"
@@ -0,0 +1,111 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+// all of these should result in 0b0110
+@Composable fun A() {
+    val x = 123
+    D {}
+    C({})
+    C(stableFun(123))
+    C(16.dp + 10.dp)
+    C(Dp(16))
+    C(16.dp)
+    C(normInt)
+    C(Int.MAX_VALUE)
+    C(stableTopLevelProp)
+    C(Modifier)
+    C(Foo.Bar)
+    C(constInt)
+    C(123)
+    C(123 + 345)
+    C(x)
+    C(x * 123)
+}
+// all of these should result in 0b0000
+@Composable fun B() {
+    C(Math.random())
+    C(Math.random() / 100f)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<D>,<C({})>,<C(stab...>,<C(16.d...>,<C(Dp(1...>,<C(16.d...>,<C(norm...>,<C(Int....>,<C(stab...>,<C(Modi...>,<C(Foo....>,<C(cons...>,<C(123)>,<C(123>,<C(x)>,<C(x>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val x = 123
+    D(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    C({
+    }, %composer, 0b0110)
+    C(stableFun(123), %composer, 0b0110)
+    C(16.dp + 10.dp, %composer, 0b0110)
+    C(Dp(16), %composer, 0b0110)
+    C(16.dp, %composer, 0b0110)
+    C(normInt, %composer, 0b0110)
+    C(Companion.MAX_VALUE, %composer, 0b0110)
+    C(stableTopLevelProp, %composer, 0b0110)
+    C(Companion, %composer, 0b0110)
+    C(Foo.Bar, %composer, 0b0110)
+    C(constInt, %composer, 0b0110)
+    C(123, %composer, 0b0110)
+    C(123 + 345, %composer, 0b0110)
+    C(x, %composer, 0b0110)
+    C(x * 123, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B)<C(Math...>,<C(Math...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    C(random(), %composer, 0)
+    C(random() / 100.0f, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticDetection\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticDetection\133useFir = true\135.txt"
new file mode 100644
index 0000000..cae10d9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testStaticDetection\133useFir = true\135.txt"
@@ -0,0 +1,111 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+// all of these should result in 0b0110
+@Composable fun A() {
+    val x = 123
+    D {}
+    C({})
+    C(stableFun(123))
+    C(16.dp + 10.dp)
+    C(Dp(16))
+    C(16.dp)
+    C(normInt)
+    C(Int.MAX_VALUE)
+    C(stableTopLevelProp)
+    C(Modifier)
+    C(Foo.Bar)
+    C(constInt)
+    C(123)
+    C(123 + 345)
+    C(x)
+    C(x * 123)
+}
+// all of these should result in 0b0000
+@Composable fun B() {
+    C(Math.random())
+    C(Math.random() / 100f)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<D>,<C({})>,<C(stab...>,<C(16.d...>,<C(Dp(1...>,<C(16.d...>,<C(norm...>,<C(Int....>,<C(stab...>,<C(Modi...>,<C(Foo....>,<C(cons...>,<C(123)>,<C(123>,<C(x)>,<C(x>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val x = 123
+    D(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    C({
+    }, %composer, 0b0110)
+    C(stableFun(123), %composer, 0b0110)
+    C(16.dp + 10.dp, %composer, 0b0110)
+    C(Dp(16), %composer, 0b0110)
+    C(16.dp, %composer, 0b0110)
+    C(normInt, %composer, 0b0110)
+    C(Companion.MAX_VALUE, %composer, 0b0110)
+    C(stableTopLevelProp, %composer, 0b0110)
+    C(Companion, %composer, 0b0110)
+    C(Foo.Bar, %composer, 0b0110)
+    C(123, %composer, 0b0110)
+    C(123, %composer, 0b0110)
+    C(468, %composer, 0b0110)
+    C(x, %composer, 0b0110)
+    C(x * 123, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun B(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B)<C(Math...>,<C(Math...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    C(random(), %composer, 0)
+    C(random() / 100.0f, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnstableVarargParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnstableVarargParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..e6e15a0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnstableVarargParams\133useFir = false\135.txt"
@@ -0,0 +1,33 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun B(vararg values: Foo) {
+    print(values)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun B(values: Array<out Foo>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  print(values)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(*values, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnstableVarargParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnstableVarargParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..e6e15a0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnstableVarargParams\133useFir = true\135.txt"
@@ -0,0 +1,33 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun B(vararg values: Foo) {
+    print(values)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun B(values: Array<out Foo>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(B):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  print(values)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    B(*values, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnusedParameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnusedParameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..19d681c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnusedParameters\133useFir = false\135.txt"
@@ -0,0 +1,107 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Unskippable(a: Unstable, b: Stable, c: MaybeStable) {
+    used(a)
+}
+@Composable
+fun Skippable1(a: Unstable, b: Stable, c: MaybeStable) {
+    used(b)
+}
+@Composable
+fun Skippable2(a: Unstable, b: Stable, c: MaybeStable) {
+    used(c)
+}
+@Composable
+fun Skippable3(a: Unstable, b: Stable, c: MaybeStable) { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Unskippable(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Unskippable):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(a)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Unskippable(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Skippable1(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Skippable1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01010001 != 0b00010000 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(b)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Skippable1(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Skippable2(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Skippable2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001010000001 != 0b10000000 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(c)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Skippable2(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Skippable3(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Skippable3):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Skippable3(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnusedParameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnusedParameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..19d681c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/testUnusedParameters\133useFir = true\135.txt"
@@ -0,0 +1,107 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Unskippable(a: Unstable, b: Stable, c: MaybeStable) {
+    used(a)
+}
+@Composable
+fun Skippable1(a: Unstable, b: Stable, c: MaybeStable) {
+    used(b)
+}
+@Composable
+fun Skippable2(a: Unstable, b: Stable, c: MaybeStable) {
+    used(c)
+}
+@Composable
+fun Skippable3(a: Unstable, b: Stable, c: MaybeStable) { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Unskippable(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Unskippable):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(a)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Unskippable(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Skippable1(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Skippable1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01010001 != 0b00010000 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(b)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Skippable1(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Skippable2(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Skippable2):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001010000001 != 0b10000000 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(c)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Skippable2(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Skippable3(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Skippable3):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Skippable3(a, b, c, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_InlineForLoop\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_InlineForLoop\133useFir = false\135.txt"
new file mode 100644
index 0000000..1249c09
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_InlineForLoop\133useFir = false\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test() {
+    Bug(listOf(1, 2, 3)) {
+        Text(it.toString())
+    }
+}
+
+@Composable
+inline fun <T> Bug(items: List<T>, content: @Composable (item: T) -> Unit) {
+    for (item in items) content(item)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Bug(li...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Bug(listOf(1, 2, 3), { it: Int, %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text(i...>:Test.kt")
+      Text(it.toString(), %composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun <T> Bug(items: List<T>, content: Function3<@[ParameterName(name = 'item')] T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Bug)P(1)*<conten...>:Test.kt")
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    content(item, %composer, 0b01110000 and %changed)
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_InlineForLoop\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_InlineForLoop\133useFir = true\135.txt"
new file mode 100644
index 0000000..212f2a8
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTests/test_InlineForLoop\133useFir = true\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test() {
+    Bug(listOf(1, 2, 3)) {
+        Text(it.toString())
+    }
+}
+
+@Composable
+inline fun <T> Bug(items: List<T>, content: @Composable (item: T) -> Unit) {
+    for (item in items) content(item)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Bug(li...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Bug(listOf(1, 2, 3), { it: @[ParameterName(name = 'item')] Int, %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text(i...>:Test.kt")
+      Text(it.toString(), %composer, 0)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun <T> Bug(items: List<T>, content: Function3<@[ParameterName(name = 'item')] T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Bug)P(1)*<conten...>:Test.kt")
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    content(item, %composer, 0b01110000 and %changed)
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testGrouplessProperty\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testGrouplessProperty\133useFir = false\135.txt"
new file mode 100644
index 0000000..725dde7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testGrouplessProperty\133useFir = false\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.currentComposer
+
+open class Foo {
+    inline val current: Int
+        @Composable
+        @ReadOnlyComposable get() = currentComposer.hashCode()
+
+    @ReadOnlyComposable
+    @Composable
+    fun getHashCode(): Int = currentComposer.hashCode()
+}
+
+@ReadOnlyComposable
+@Composable
+fun getHashCode(): Int = currentComposer.hashCode()
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+open class Foo {
+  val current: Int
+    @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
+    get() {
+      val tmp0 = %composer.hashCode()
+      return tmp0
+    }
+  @ReadOnlyComposable
+  @Composable
+  fun getHashCode(%composer: Composer?, %changed: Int): Int {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = %composer.hashCode()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    return tmp0
+  }
+  static val %stable: Int = 0
+}
+@ReadOnlyComposable
+@Composable
+fun getHashCode(%composer: Composer?, %changed: Int): Int {
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = %composer.hashCode()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testGrouplessProperty\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testGrouplessProperty\133useFir = true\135.txt"
new file mode 100644
index 0000000..725dde7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testGrouplessProperty\133useFir = true\135.txt"
@@ -0,0 +1,63 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.currentComposer
+
+open class Foo {
+    inline val current: Int
+        @Composable
+        @ReadOnlyComposable get() = currentComposer.hashCode()
+
+    @ReadOnlyComposable
+    @Composable
+    fun getHashCode(): Int = currentComposer.hashCode()
+}
+
+@ReadOnlyComposable
+@Composable
+fun getHashCode(): Int = currentComposer.hashCode()
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+open class Foo {
+  val current: Int
+    @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
+    get() {
+      val tmp0 = %composer.hashCode()
+      return tmp0
+    }
+  @ReadOnlyComposable
+  @Composable
+  fun getHashCode(%composer: Composer?, %changed: Int): Int {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val tmp0 = %composer.hashCode()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    return tmp0
+  }
+  static val %stable: Int = 0
+}
+@ReadOnlyComposable
+@Composable
+fun getHashCode(%composer: Composer?, %changed: Int): Int {
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = %composer.hashCode()
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testNonSkippableComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testNonSkippableComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..dbaf284
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testNonSkippableComposable\133useFir = false\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            import androidx.compose.runtime.NonSkippableComposable
+
+@Composable
+@NonSkippableComposable
+fun Test(i: Int) {
+    used(i)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonSkippableComposable
+fun Test(i: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(i)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(i, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testNonSkippableComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testNonSkippableComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..dbaf284
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/testNonSkippableComposable\133useFir = true\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            import androidx.compose.runtime.NonSkippableComposable
+
+@Composable
+@NonSkippableComposable
+fun Test(i: Int) {
+    used(i)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonSkippableComposable
+fun Test(i: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  used(i)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(i, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_ComposableLambdaWithUnusedParameter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_ComposableLambdaWithUnusedParameter\133useFir = false\135.txt"
new file mode 100644
index 0000000..1ea1f8a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_ComposableLambdaWithUnusedParameter\133useFir = false\135.txt"
@@ -0,0 +1,30 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+val layoutLambda = @Composable { _: Int ->
+    Layout()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val layoutLambda: Function3<Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { <unused var>: Int, %composer: Composer?, %changed: Int ->
+    if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Layout(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_ComposableLambdaWithUnusedParameter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_ComposableLambdaWithUnusedParameter\133useFir = true\135.txt"
new file mode 100644
index 0000000..1ea1f8a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_ComposableLambdaWithUnusedParameter\133useFir = true\135.txt"
@@ -0,0 +1,30 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+val layoutLambda = @Composable { _: Int ->
+    Layout()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val layoutLambda: Function3<Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { <unused var>: Int, %composer: Composer?, %changed: Int ->
+    if (%changed and 0b01010001 != 0b00010000 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Layout(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineForLoop_no_source_info\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineForLoop_no_source_info\133useFir = false\135.txt"
new file mode 100644
index 0000000..ad94e8d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineForLoop_no_source_info\133useFir = false\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test() {
+    Bug(listOf(1, 2, 3)) {
+        Text(it.toString())
+    }
+}
+
+@Composable
+private inline fun <T> Bug(items: List<T>, content: @Composable (item: T) -> Unit) {
+    for (item in items) content(item)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Bug(listOf(1, 2, 3), { it: Int, %composer: Composer?, %changed: Int ->
+      Text(it.toString(), %composer, 0)
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+private fun <T> Bug(items: List<T>, content: Function3<@[ParameterName(name = 'item')] T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    content(item, %composer, 0b01110000 and %changed)
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineForLoop_no_source_info\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineForLoop_no_source_info\133useFir = true\135.txt"
new file mode 100644
index 0000000..86c92bd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineForLoop_no_source_info\133useFir = true\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+private fun Test() {
+    Bug(listOf(1, 2, 3)) {
+        Text(it.toString())
+    }
+}
+
+@Composable
+private inline fun <T> Bug(items: List<T>, content: @Composable (item: T) -> Unit) {
+    for (item in items) content(item)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+private fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Bug(listOf(1, 2, 3), { it: @[ParameterName(name = 'item')] Int, %composer: Composer?, %changed: Int ->
+      Text(it.toString(), %composer, 0)
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+private fun <T> Bug(items: List<T>, content: Function3<@[ParameterName(name = 'item')] T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    content(item, %composer, 0b01110000 and %changed)
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineSkipping\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineSkipping\133useFir = false\135.txt"
new file mode 100644
index 0000000..3df5bc7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineSkipping\133useFir = false\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test() {
+    InlineWrapperParam {
+        Text("Function $it")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    InlineWrapperParam({ it: Int, %composer: Composer?, %changed: Int ->
+      Text("Function %it", %composer, 0)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineSkipping\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineSkipping\133useFir = true\135.txt"
new file mode 100644
index 0000000..3df5bc7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionBodySkippingTransformTestsNoSource/test_InlineSkipping\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test() {
+    InlineWrapperParam {
+        Text("Function $it")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    InlineWrapperParam({ it: Int, %composer: Composer?, %changed: Int ->
+      Text("Function %it", %composer, 0)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testCaptureStableFunInterface\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testCaptureStableFunInterface\133useFir = false\135.txt"
new file mode 100644
index 0000000..d939cac
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testCaptureStableFunInterface\133useFir = false\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface Consumer {
+    fun consume(t: Int)
+}
+
+@Composable fun Test(int: Int) {
+    Example {
+        println(int)
+    }
+}
+
+@Composable inline fun Example(consumer: Consumer) {
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Consumer {
+  abstract fun consume(t: Int)
+}
+@Composable
+fun Test(int: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(int)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Example(<block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(int)) {
+        Consumer { it: Int ->
+          println(int)
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(int, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Example):Test.kt")
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testCaptureStableFunInterface\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testCaptureStableFunInterface\133useFir = true\135.txt"
new file mode 100644
index 0000000..d939cac
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testCaptureStableFunInterface\133useFir = true\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface Consumer {
+    fun consume(t: Int)
+}
+
+@Composable fun Test(int: Int) {
+    Example {
+        println(int)
+    }
+}
+
+@Composable inline fun Example(consumer: Consumer) {
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Consumer {
+  abstract fun consume(t: Int)
+}
+@Composable
+fun Test(int: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(int)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Example(<block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(int)) {
+        Consumer { it: Int ->
+          println(int)
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(int, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Example):Test.kt")
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaceWAnonymousParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaceWAnonymousParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..8fe8115
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaceWAnonymousParam\133useFir = false\135.txt"
@@ -0,0 +1,87 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface Consumer {
+    @Composable operator fun invoke(t: Int)
+}
+
+@Composable fun Test(int: Int) {
+    Example { _ ->
+    }
+}
+
+@Composable fun Example(consumer: Consumer) {
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Consumer {
+  @Composable
+  abstract fun invoke(t: Int, %composer: Composer?, %changed: Int)
+}
+@Composable
+fun Test(int: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Example(<block>{
+      class <no name provided> : Consumer {
+        @Composable
+        override fun invoke(<unused var>: Int, %composer: Composer?, %changed: Int) {
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(invoke):Test.kt")
+          if (%changed and 0b0001 != 0 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %changed, -1, <>)
+            }
+            Unit
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+          val tmp0_rcvr = <this>
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            tmp0_rcvr.invoke(<unused var>, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(int, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(consumer, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaceWAnonymousParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaceWAnonymousParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..8fe8115
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaceWAnonymousParam\133useFir = true\135.txt"
@@ -0,0 +1,87 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface Consumer {
+    @Composable operator fun invoke(t: Int)
+}
+
+@Composable fun Test(int: Int) {
+    Example { _ ->
+    }
+}
+
+@Composable fun Example(consumer: Consumer) {
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Consumer {
+  @Composable
+  abstract fun invoke(t: Int, %composer: Composer?, %changed: Int)
+}
+@Composable
+fun Test(int: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Example(<block>{
+      class <no name provided> : Consumer {
+        @Composable
+        override fun invoke(<unused var>: Int, %composer: Composer?, %changed: Int) {
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(invoke):Test.kt")
+          if (%changed and 0b0001 != 0 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %changed, -1, <>)
+            }
+            Unit
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+          val tmp0_rcvr = <this>
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            tmp0_rcvr.invoke(<unused var>, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(int, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(consumer, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfacesInVariance\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfacesInVariance\133useFir = false\135.txt"
new file mode 100644
index 0000000..3bf8de2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfacesInVariance\133useFir = false\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface Consumer<T> {
+    @Composable fun consume(t: T)
+}
+
+class Repro<T : Any> {
+    fun test(consumer: Consumer<in T>) {}
+}
+
+fun test() {
+    Repro<String>().test { string ->
+        println(string)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Consumer<T>  {
+  @Composable
+  abstract fun consume(t: T, %composer: Composer?, %changed: Int)
+}
+@StabilityInferred(parameters = 0)
+class Repro<T: Any>  {
+  fun test(consumer: Consumer<in T>) { }
+  static val %stable: Int = 0
+}
+fun test() {
+  Repro().test(<block>{
+    class <no name provided> : Consumer<Any?> {
+      @Composable
+      override fun consume(string: String, %composer: Composer?, %changed: Int) {
+        %composer = %composer.startRestartGroup(<>)
+        sourceInformation(%composer, "C(consume):Test.kt")
+        val %dirty = %changed
+        if (%changed and 0b1110 == 0) {
+          %dirty = %dirty or if (%composer.changed(string)) 0b0100 else 0b0010
+        }
+        if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %dirty, -1, <>)
+          }
+          println(string)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+        val tmp0_rcvr = <this>
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          tmp0_rcvr.consume(string, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+      }
+    }
+    <no name provided>()
+  })
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfacesInVariance\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfacesInVariance\133useFir = true\135.txt"
new file mode 100644
index 0000000..3bf8de2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfacesInVariance\133useFir = true\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface Consumer<T> {
+    @Composable fun consume(t: T)
+}
+
+class Repro<T : Any> {
+    fun test(consumer: Consumer<in T>) {}
+}
+
+fun test() {
+    Repro<String>().test { string ->
+        println(string)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Consumer<T>  {
+  @Composable
+  abstract fun consume(t: T, %composer: Composer?, %changed: Int)
+}
+@StabilityInferred(parameters = 0)
+class Repro<T: Any>  {
+  fun test(consumer: Consumer<in T>) { }
+  static val %stable: Int = 0
+}
+fun test() {
+  Repro().test(<block>{
+    class <no name provided> : Consumer<Any?> {
+      @Composable
+      override fun consume(string: String, %composer: Composer?, %changed: Int) {
+        %composer = %composer.startRestartGroup(<>)
+        sourceInformation(%composer, "C(consume):Test.kt")
+        val %dirty = %changed
+        if (%changed and 0b1110 == 0) {
+          %dirty = %dirty or if (%composer.changed(string)) 0b0100 else 0b0010
+        }
+        if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %dirty, -1, <>)
+          }
+          println(string)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+        val tmp0_rcvr = <this>
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          tmp0_rcvr.consume(string, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+      }
+    }
+    <no name provided>()
+  })
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaces\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaces\133useFir = false\135.txt"
new file mode 100644
index 0000000..a899aa1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaces\133useFir = false\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface A {
+    @Composable fun compute(value: Int): Unit
+}
+fun Example(a: A) {
+    Example { it -> a.compute(it) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface A {
+  @Composable
+  abstract fun compute(value: Int, %composer: Composer?, %changed: Int)
+}
+fun Example(a: A) {
+  Example(<block>{
+    class <no name provided> : A {
+      @Composable
+      override fun compute(it: Int, %composer: Composer?, %changed: Int) {
+        %composer = %composer.startRestartGroup(<>)
+        sourceInformation(%composer, "C(compute)<comput...>:Test.kt")
+        val %dirty = %changed
+        if (%changed and 0b1110 == 0) {
+          %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
+        }
+        if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %dirty, -1, <>)
+          }
+          a.compute(it, %composer, 0b1110 and %dirty)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+        val tmp0_rcvr = <this>
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          tmp0_rcvr.compute(it, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+      }
+    }
+    <no name provided>()
+  })
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaces\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaces\133useFir = true\135.txt"
new file mode 100644
index 0000000..a899aa1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testComposableFunInterfaces\133useFir = true\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface A {
+    @Composable fun compute(value: Int): Unit
+}
+fun Example(a: A) {
+    Example { it -> a.compute(it) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface A {
+  @Composable
+  abstract fun compute(value: Int, %composer: Composer?, %changed: Int)
+}
+fun Example(a: A) {
+  Example(<block>{
+    class <no name provided> : A {
+      @Composable
+      override fun compute(it: Int, %composer: Composer?, %changed: Int) {
+        %composer = %composer.startRestartGroup(<>)
+        sourceInformation(%composer, "C(compute)<comput...>:Test.kt")
+        val %dirty = %changed
+        if (%changed and 0b1110 == 0) {
+          %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
+        }
+        if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %dirty, -1, <>)
+          }
+          a.compute(it, %composer, 0b1110 and %dirty)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+        val tmp0_rcvr = <this>
+        %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+          tmp0_rcvr.compute(it, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+      }
+    }
+    <no name provided>()
+  })
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunInterfaces\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunInterfaces\133useFir = false\135.txt"
new file mode 100644
index 0000000..f2ffbbf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunInterfaces\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface A {
+    fun compute(value: Int): Unit
+}
+
+@Composable
+fun Example(a: A) {
+    Example { it -> a.compute(it) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface A {
+  abstract fun compute(value: Int)
+}
+@Composable
+fun Example(a: A, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<Exampl...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Example(A { it: Int ->
+      a.compute(it)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunInterfaces\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunInterfaces\133useFir = true\135.txt"
new file mode 100644
index 0000000..f2ffbbf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunInterfaces\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface A {
+    fun compute(value: Int): Unit
+}
+
+@Composable
+fun Example(a: A) {
+    Example { it -> a.compute(it) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface A {
+  abstract fun compute(value: Int)
+}
+@Composable
+fun Example(a: A, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<Exampl...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Example(A { it: Int ->
+      a.compute(it)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunctionalInterfaceWithExtensionReceiverTransformation\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunctionalInterfaceWithExtensionReceiverTransformation\133useFir = false\135.txt"
new file mode 100644
index 0000000..510195c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunctionalInterfaceWithExtensionReceiverTransformation\133useFir = false\135.txt"
@@ -0,0 +1,102 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+fun interface TestContent {
+    @Composable
+    fun String.Content()
+}
+@Composable
+fun Test(content: TestContent) {
+    with(content) {
+        "".Content()
+    }
+}
+
+@Composable
+fun CallTest() {
+    Test { this.length }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface TestContent {
+  @Composable
+  abstract fun String.Content(%composer: Composer?, %changed: Int)
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Test(content: TestContent, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<Conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    with(content) {
+      %this%with.Content(%composer, 0b0110)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun CallTest(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CallTest)<Test>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Test(<block>{
+      class <no name provided> : TestContent {
+        @Composable
+        override fun Content(%this%Test: String, %composer: Composer?, %changed: Int) {
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(Content):Test.kt")
+          val %dirty = %changed
+          if (%changed and 0b1110 == 0) {
+            %dirty = %dirty or if (%composer.changed(%this%Test)) 0b0100 else 0b0010
+          }
+          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %dirty, -1, <>)
+            }
+            %this%Test.length
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+          val tmp0_rcvr = <this>
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            tmp0_rcvr.Content(%this%Test, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CallTest(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunctionalInterfaceWithExtensionReceiverTransformation\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunctionalInterfaceWithExtensionReceiverTransformation\133useFir = true\135.txt"
new file mode 100644
index 0000000..510195c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testFunctionalInterfaceWithExtensionReceiverTransformation\133useFir = true\135.txt"
@@ -0,0 +1,102 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+fun interface TestContent {
+    @Composable
+    fun String.Content()
+}
+@Composable
+fun Test(content: TestContent) {
+    with(content) {
+        "".Content()
+    }
+}
+
+@Composable
+fun CallTest() {
+    Test { this.length }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface TestContent {
+  @Composable
+  abstract fun String.Content(%composer: Composer?, %changed: Int)
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Test(content: TestContent, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<Conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    with(content) {
+      %this%with.Content(%composer, 0b0110)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun CallTest(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CallTest)<Test>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Test(<block>{
+      class <no name provided> : TestContent {
+        @Composable
+        override fun Content(%this%Test: String, %composer: Composer?, %changed: Int) {
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(Content):Test.kt")
+          val %dirty = %changed
+          if (%changed and 0b1110 == 0) {
+            %dirty = %dirty or if (%composer.changed(%this%Test)) 0b0100 else 0b0010
+          }
+          if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %dirty, -1, <>)
+            }
+            %this%Test.length
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+          val tmp0_rcvr = <this>
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            tmp0_rcvr.Content(%this%Test, %composer, updateChangedFlags(%changed or 0b0001))
+          }
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CallTest(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testNoCaptureFunInterface\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testNoCaptureFunInterface\133useFir = false\135.txt"
new file mode 100644
index 0000000..4e5db6e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testNoCaptureFunInterface\133useFir = false\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface Consumer {
+    fun consume(t: Int)
+}
+
+@Composable fun Test(int: Int) {
+    Example {
+        println(it)
+    }
+}
+
+@Composable inline fun Example(consumer: Consumer) {
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Consumer {
+  abstract fun consume(t: Int)
+}
+@Composable
+fun Test(int: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Example(Consumer { it: Int ->
+      println(it)
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(int, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Example):Test.kt")
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testNoCaptureFunInterface\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testNoCaptureFunInterface\133useFir = true\135.txt"
new file mode 100644
index 0000000..4e5db6e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.FunctionalInterfaceTransformTests/testNoCaptureFunInterface\133useFir = true\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+fun interface Consumer {
+    fun consume(t: Int)
+}
+
+@Composable fun Test(int: Int) {
+    Example {
+        println(it)
+    }
+}
+
+@Composable inline fun Example(consumer: Consumer) {
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Consumer {
+  abstract fun consume(t: Int)
+}
+@Composable
+fun Test(int: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Example(Consumer { it: Int ->
+      println(it)
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(int, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Example(consumer: Consumer, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Example):Test.kt")
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testJvmNameComposableSingletons\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testJvmNameComposableSingletons\133useFir = false\135.txt"
new file mode 100644
index 0000000..e5d7343
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testJvmNameComposableSingletons\133useFir = false\135.txt"
@@ -0,0 +1,30 @@
+//
+// Source
+// ------------------------------------------
+
+@file:JvmName("A")
+import androidx.compose.runtime.Composable
+
+val x = @Composable {}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testJvmNameComposableSingletons\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testJvmNameComposableSingletons\133useFir = true\135.txt"
new file mode 100644
index 0000000..e5d7343
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testJvmNameComposableSingletons\133useFir = true\135.txt"
@@ -0,0 +1,30 @@
+//
+// Source
+// ------------------------------------------
+
+@file:JvmName("A")
+import androidx.compose.runtime.Composable
+
+val x = @Composable {}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass2\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass2\133useFir = false\135.txt"
new file mode 100644
index 0000000..a1749b9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass2\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class A {
+    class B {
+        val x = @Composable {}
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class A {
+  @StabilityInferred(parameters = 0)
+  class B {
+    val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+    static val %stable: Int = 0
+  }
+  static val %stable: Int = 0
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass2\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass2\133useFir = true\135.txt"
new file mode 100644
index 0000000..a1749b9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass2\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class A {
+    class B {
+        val x = @Composable {}
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class A {
+  @StabilityInferred(parameters = 0)
+  class B {
+    val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+    static val %stable: Int = 0
+  }
+  static val %stable: Int = 0
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass\133useFir = false\135.txt"
new file mode 100644
index 0000000..0d4633d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass\133useFir = false\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class A {
+    val x = @Composable {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class A {
+  val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+  static val %stable: Int = 0
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass\133useFir = true\135.txt"
new file mode 100644
index 0000000..0d4633d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationRegressionTests/testNestedComposableSingletonsClass\133useFir = true\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class A {
+    val x = @Composable {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class A {
+  val x: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+  static val %stable: Int = 0
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/memoizeLambdaInsideFunctionReturningValue\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/memoizeLambdaInsideFunctionReturningValue\133useFir = false\135.txt"
new file mode 100644
index 0000000..763ae86
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/memoizeLambdaInsideFunctionReturningValue\133useFir = false\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(foo: Foo): Int =
+  Consume { foo.value }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Consum...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = Consume(<block>{
+    %composer.startReplaceableGroup(<>)
+    val tmpCache = %composer.cache(%composer.changed(foo)) {
+      {
+        foo.value
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmpCache
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/memoizeLambdaInsideFunctionReturningValue\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/memoizeLambdaInsideFunctionReturningValue\133useFir = true\135.txt"
new file mode 100644
index 0000000..763ae86
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/memoizeLambdaInsideFunctionReturningValue\133useFir = true\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(foo: Foo): Int =
+  Consume { foo.value }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, %composer: Composer?, %changed: Int): Int {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test)<Consum...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = Consume(<block>{
+    %composer.startReplaceableGroup(<>)
+    val tmpCache = %composer.cache(%composer.changed(foo)) {
+      {
+        foo.value
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmpCache
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCapturedThisFromFieldInitializer\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCapturedThisFromFieldInitializer\133useFir = false\135.txt"
new file mode 100644
index 0000000..829deb3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCapturedThisFromFieldInitializer\133useFir = false\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class A {
+    val b = ""
+    val c = @Composable {
+        print(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class A {
+  val b: String = ""
+  val c: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      print(b)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCapturedThisFromFieldInitializer\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCapturedThisFromFieldInitializer\133useFir = true\135.txt"
new file mode 100644
index 0000000..829deb3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCapturedThisFromFieldInitializer\133useFir = true\135.txt"
@@ -0,0 +1,36 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class A {
+    val b = ""
+    val c = @Composable {
+        print(b)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class A {
+  val b: String = ""
+  val c: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      print(b)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposabableLambdaInLocalDeclaration\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposabableLambdaInLocalDeclaration\133useFir = false\135.txt"
new file mode 100644
index 0000000..432c028
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposabableLambdaInLocalDeclaration\133useFir = false\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(enabled: Boolean) {
+    val content: @Composable () -> Unit = {
+        Display("$enabled")
+    }
+    Wrap(content)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(enabled: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Wrap(c...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val content = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Displa...>:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        Display("%enabled", %composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    Wrap(content, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(enabled, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposabableLambdaInLocalDeclaration\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposabableLambdaInLocalDeclaration\133useFir = true\135.txt"
new file mode 100644
index 0000000..432c028
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposabableLambdaInLocalDeclaration\133useFir = true\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(enabled: Boolean) {
+    val content: @Composable () -> Unit = {
+        Display("$enabled")
+    }
+    Wrap(content)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(enabled: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Wrap(c...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val content = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Displa...>:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        Display("%enabled", %composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    Wrap(content, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(enabled, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableCaptureInDelegates\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableCaptureInDelegates\133useFir = false\135.txt"
new file mode 100644
index 0000000..63ece0b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableCaptureInDelegates\133useFir = false\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+class Test(val value: Int) : Delegate by Impl({
+    value
+})
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Test(val value: Int) : Delegate {
+  private val %%delegate_0: Impl = Impl(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      value
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  )
+  val content: Function2<Composer, Int, Unit>
+    get() {
+      return <this>.%%delegate_0.content
+    }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableCaptureInDelegates\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableCaptureInDelegates\133useFir = true\135.txt"
new file mode 100644
index 0000000..6a0874c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableCaptureInDelegates\133useFir = true\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+class Test(val value: Int) : Delegate by Impl({
+    value
+})
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Test(val value: Int) : Delegate {
+  val content: Function2<Composer, Int, Unit>
+    get() {
+      return <this>.%%delegate_0.content
+    }
+  private val %%delegate_0: Impl = Impl(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      value
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  )
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableInAFunctionParameter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableInAFunctionParameter\133useFir = false\135.txt"
new file mode 100644
index 0000000..c60bcb3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableInAFunctionParameter\133useFir = false\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(enabled: Boolean, content: @Composable () -> Unit = {
+        Display("$enabled")
+    }
+) {
+    Wrap(content)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(enabled: Boolean, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(1)<Wrap(c...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0010 != 0) {
+      content = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<Displa...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          Display("%enabled", %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Wrap(content, %composer, 0b1110 and %dirty shr 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(enabled, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableInAFunctionParameter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableInAFunctionParameter\133useFir = true\135.txt"
new file mode 100644
index 0000000..c60bcb3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testComposableInAFunctionParameter\133useFir = true\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(enabled: Boolean, content: @Composable () -> Unit = {
+        Display("$enabled")
+    }
+) {
+    Wrap(content)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(enabled: Boolean, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(1)<Wrap(c...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b01011011 != 0b00010010 || !%composer.skipping) {
+    if (%default and 0b0010 != 0) {
+      content = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<Displa...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          Display("%enabled", %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Wrap(content, %composer, 0b1110 and %dirty shr 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(enabled, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCrossinlineLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCrossinlineLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..c3fc89a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCrossinlineLambda\133useFir = false\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+  var lambda: (@Composable () -> Unit)? = null
+  f { s -> lambda = { Text(s) } }
+  lambda?.let { it() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<it()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    var lambda = null
+    f { s: String ->
+      lambda = composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<Text(s...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          Text(s, %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }
+    val tmp0_safe_receiver = lambda
+    val tmp0_group = when {
+      tmp0_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp0_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
+          it(%composer, 0)
+        }
+      }
+    }
+    tmp0_group
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCrossinlineLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCrossinlineLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..c3fc89a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testCrossinlineLambda\133useFir = true\135.txt"
@@ -0,0 +1,64 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+  var lambda: (@Composable () -> Unit)? = null
+  f { s -> lambda = { Text(s) } }
+  lambda?.let { it() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<it()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    var lambda = null
+    f { s: String ->
+      lambda = composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<Text(s...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          Text(s, %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }
+    val tmp0_safe_receiver = lambda
+    val tmp0_group = when {
+      tmp0_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp0_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
+          it(%composer, 0)
+        }
+      }
+    }
+    tmp0_group
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceNonComposableMemoization\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceNonComposableMemoization\133useFir = false\135.txt"
new file mode 100644
index 0000000..0f56299
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceNonComposableMemoization\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+@Composable fun Example(x: Int) {
+    fun foo() { use(x) }
+    val shouldMemoize: ()->(()->Unit) = { ::foo }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    fun foo() {
+      use(x)
+    }
+    val shouldMemoize = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(x)) {
+        {
+          foo
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceNonComposableMemoization\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceNonComposableMemoization\133useFir = true\135.txt"
new file mode 100644
index 0000000..0f56299
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceNonComposableMemoization\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+@Composable fun Example(x: Int) {
+    fun foo() { use(x) }
+    val shouldMemoize: ()->(()->Unit) = { ::foo }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(x: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    fun foo() {
+      use(x)
+    }
+    val shouldMemoize = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(x)) {
+        {
+          foo
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceWithinInferredComposableLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceWithinInferredComposableLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..45b3e29
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceWithinInferredComposableLambda\133useFir = false\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+fun Problem() {
+    fun foo() { }
+    val lambda: @Composable ()->Unit = {
+        ::foo
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun Problem() {
+  fun foo() { }
+  val lambda = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      foo
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceWithinInferredComposableLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceWithinInferredComposableLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..45b3e29
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testFunctionReferenceWithinInferredComposableLambda\133useFir = true\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+fun Problem() {
+    fun foo() { }
+    val lambda: @Composable ()->Unit = {
+        ::foo
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun Problem() {
+  fun foo() { }
+  val lambda = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      foo
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaDoesCapture\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaDoesCapture\133useFir = false\135.txt"
new file mode 100644
index 0000000..f680079
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaDoesCapture\133useFir = false\135.txt"
@@ -0,0 +1,77 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun TestLambda(content: () -> Unit) {
+  content()
+}
+
+@Composable
+fun Test(a: String) {
+  TestLambda {
+    println("Captures a" + a)
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun TestLambda(content: Function0<Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(TestLambda):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    TestLambda(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(a: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<TestLa...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    TestLambda(<block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(a)) {
+        {
+          println("Captures a" + a)
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaDoesCapture\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaDoesCapture\133useFir = true\135.txt"
new file mode 100644
index 0000000..f680079
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaDoesCapture\133useFir = true\135.txt"
@@ -0,0 +1,77 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun TestLambda(content: () -> Unit) {
+  content()
+}
+
+@Composable
+fun Test(a: String) {
+  TestLambda {
+    println("Captures a" + a)
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun TestLambda(content: Function0<Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(TestLambda):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    TestLambda(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(a: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<TestLa...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    TestLambda(<block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(a)) {
+        {
+          println("Captures a" + a)
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaNoCapture\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaNoCapture\133useFir = false\135.txt"
new file mode 100644
index 0000000..435eebf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaNoCapture\133useFir = false\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun TestLambda(content: () -> Unit) {
+  content()
+}
+
+@Composable
+fun Test() {
+  TestLambda {
+    println("Doesn't capture")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun TestLambda(content: Function0<Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(TestLambda):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    TestLambda(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<TestLa...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    TestLambda({
+      println("Doesn't capture")
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaNoCapture\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaNoCapture\133useFir = true\135.txt"
new file mode 100644
index 0000000..435eebf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLambdaNoCapture\133useFir = true\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun TestLambda(content: () -> Unit) {
+  content()
+}
+
+@Composable
+fun Test() {
+  TestLambda {
+    println("Doesn't capture")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun TestLambda(content: Function0<Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(TestLambda):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content()
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    TestLambda(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<TestLa...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    TestLambda({
+      println("Doesn't capture")
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures1\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures1\133useFir = false\135.txt"
new file mode 100644
index 0000000..0a8b775
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures1\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.Composable
+
+@NonRestartableComposable
+@Composable
+fun Err(y: Int, z: Int) {
+    class Local {
+        val w = z
+        fun something(x: Int): Int { return x + y + w }
+    }
+    {
+      Local().something(2)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Err(y: Int, z: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Err):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  class Local {
+    val w: Int = z
+    fun something(x: Int): Int {
+      return x + y + w
+    }
+  }
+  %composer.startReplaceableGroup(<>)
+  val tmpCache = %composer.cache(%composer.changed(y) or %composer.changed(z)) {
+    {
+      Local().something(2)
+    }
+  }
+  %composer.endReplaceableGroup()
+  tmpCache
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures1\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures1\133useFir = true\135.txt"
new file mode 100644
index 0000000..0a8b775
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures1\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.Composable
+
+@NonRestartableComposable
+@Composable
+fun Err(y: Int, z: Int) {
+    class Local {
+        val w = z
+        fun something(x: Int): Int { return x + y + w }
+    }
+    {
+      Local().something(2)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Err(y: Int, z: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Err):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  class Local {
+    val w: Int = z
+    fun something(x: Int): Int {
+      return x + y + w
+    }
+  }
+  %composer.startReplaceableGroup(<>)
+  val tmpCache = %composer.cache(%composer.changed(y) or %composer.changed(z)) {
+    {
+      Local().something(2)
+    }
+  }
+  %composer.endReplaceableGroup()
+  tmpCache
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures2\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures2\133useFir = false\135.txt"
new file mode 100644
index 0000000..f51fe66
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures2\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+@NonRestartableComposable
+@Composable
+fun Example(z: Int) {
+    class Foo(val x: Int) { val y = z }
+    val lambda: () -> Any = {
+        Foo(1)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(z: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  class Foo(val x: Int) {
+    val y: Int = z
+  }
+  val lambda = <block>{
+    %composer.startReplaceableGroup(<>)
+    val tmpCache = %composer.cache(%composer.changed(z)) {
+      {
+        Foo(1)
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmpCache
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures2\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures2\133useFir = true\135.txt"
new file mode 100644
index 0000000..f51fe66
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalClassCaptures2\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+
+@NonRestartableComposable
+@Composable
+fun Example(z: Int) {
+    class Foo(val x: Int) { val y = z }
+    val lambda: () -> Any = {
+        Foo(1)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Example(z: Int, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  class Foo(val x: Int) {
+    val y: Int = z
+  }
+  val lambda = <block>{
+    %composer.startReplaceableGroup(<>)
+    val tmpCache = %composer.cache(%composer.changed(z)) {
+      {
+        Foo(1)
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmpCache
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures3\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures3\133useFir = false\135.txt"
new file mode 100644
index 0000000..653cafe
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures3\133useFir = false\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun SimpleAnimatedContentSample() {
+    @Composable fun Foo() {}
+
+    AnimatedContent(1f) {
+        Foo()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun SimpleAnimatedContentSample(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SimpleAnimatedContentSample)<Animat...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    @Composable
+    fun Foo(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Foo):Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    AnimatedContent(1.0f, composableLambda(%composer, <>, false) { it: Float, %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Foo()>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Foo(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    }, %composer, 0b00110110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SimpleAnimatedContentSample(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures3\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures3\133useFir = true\135.txt"
new file mode 100644
index 0000000..aadb90e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures3\133useFir = true\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun SimpleAnimatedContentSample() {
+    @Composable fun Foo() {}
+
+    AnimatedContent(1f) {
+        Foo()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun SimpleAnimatedContentSample(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(SimpleAnimatedContentSample)<Animat...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    @Composable
+    fun Foo(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Foo):Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    AnimatedContent(1.0f, composableLambda(%composer, <>, false) { it: @[ParameterName(name = 'targetState')] Float, %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Foo()>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Foo(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    }, %composer, 0b00110110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    SimpleAnimatedContentSample(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures\133useFir = false\135.txt"
new file mode 100644
index 0000000..6f6a11d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures\133useFir = false\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.Composable
+
+@NonRestartableComposable
+@Composable
+fun Err() {
+    // `x` is not a capture of handler, but is treated as such.
+    fun handler() {
+        { x: Int -> x }
+    }
+    // Lambda calling handler. To find captures, we need captures of `handler`.
+    {
+      handler()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Err(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Err):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  fun handler() {
+    { x: Int ->
+      x
+    }
+  }
+  {
+    handler()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures\133useFir = true\135.txt"
new file mode 100644
index 0000000..6f6a11d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalFunCaptures\133useFir = true\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.Composable
+
+@NonRestartableComposable
+@Composable
+fun Err() {
+    // `x` is not a capture of handler, but is treated as such.
+    fun handler() {
+        { x: Int -> x }
+    }
+    // Lambda calling handler. To find captures, we need captures of `handler`.
+    {
+      handler()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@NonRestartableComposable
+@Composable
+fun Err(%composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Err):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  fun handler() {
+    { x: Int ->
+      x
+    }
+  }
+  {
+    handler()
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalInALocal\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalInALocal\133useFir = false\135.txt"
new file mode 100644
index 0000000..36d03b7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalInALocal\133useFir = false\135.txt"
@@ -0,0 +1,88 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable fun Example() {
+    @Composable fun A() { }
+    @Composable fun B(content: @Composable () -> Unit) { content() }
+    @Composable fun C() {
+        B { A() }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    @Composable
+    fun A(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(A):Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    @Composable
+    @ComposableInferredTarget(scheme = "[0[0]]")
+    fun B(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(B)<conten...>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      content(%composer, 0b1110 and %changed)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    @Composable
+    fun C(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(C)<B>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      B(composableLambda(%composer, <>, false) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<A()>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          A(%composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }, %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalInALocal\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalInALocal\133useFir = true\135.txt"
new file mode 100644
index 0000000..36d03b7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalInALocal\133useFir = true\135.txt"
@@ -0,0 +1,88 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable fun Example() {
+    @Composable fun A() { }
+    @Composable fun B(content: @Composable () -> Unit) { content() }
+    @Composable fun C() {
+        B { A() }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    @Composable
+    fun A(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(A):Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    @Composable
+    @ComposableInferredTarget(scheme = "[0[0]]")
+    fun B(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(B)<conten...>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      content(%composer, 0b1110 and %changed)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    @Composable
+    fun C(%composer: Composer?, %changed: Int) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(C)<B>:Test.kt")
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      B(composableLambda(%composer, <>, false) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<A()>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          A(%composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }, %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endReplaceableGroup()
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalVariableComposableLambdas\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalVariableComposableLambdas\133useFir = false\135.txt"
new file mode 100644
index 0000000..b5e7854
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalVariableComposableLambdas\133useFir = false\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable fun A() {
+    val foo = @Composable {}
+    val bar: @Composable () -> Unit = {}
+    B(foo)
+    B(bar)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B(foo)>,<B(bar)>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = ComposableSingletons%TestKt.lambda-1
+    val bar = ComposableSingletons%TestKt.lambda-2
+    B(foo, %composer, 0b0110)
+    B(bar, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalVariableComposableLambdas\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalVariableComposableLambdas\133useFir = true\135.txt"
new file mode 100644
index 0000000..b5e7854
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testLocalVariableComposableLambdas\133useFir = true\135.txt"
@@ -0,0 +1,69 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable fun A() {
+    val foo = @Composable {}
+    val bar: @Composable () -> Unit = {}
+    B(foo)
+    B(bar)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B(foo)>,<B(bar)>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = ComposableSingletons%TestKt.lambda-1
+    val bar = ComposableSingletons%TestKt.lambda-2
+    B(foo, %composer, 0b0110)
+    B(bar, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testParameterComposableLambdas\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testParameterComposableLambdas\133useFir = false\135.txt"
new file mode 100644
index 0000000..2a971d4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testParameterComposableLambdas\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable fun A() {
+    B {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    B(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testParameterComposableLambdas\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testParameterComposableLambdas\133useFir = true\135.txt"
new file mode 100644
index 0000000..2a971d4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testParameterComposableLambdas\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable fun A() {
+    B {}
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    B(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testRememberComposableLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testRememberComposableLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..0b28cfa
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testRememberComposableLambda\133useFir = false\135.txt"
@@ -0,0 +1,71 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(s: String) {
+  remember<@Composable () -> Unit> { { Text(s) } }()
+  currentComposer.cache<@Composable () -> Unit>(false) { { Text(s) } }()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(s: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<rememb...>,<rememb...>,<curren...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(s)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    remember({
+      composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<Text(s...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          Text(s, %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }, %composer, 0)(%composer, 6)
+    %composer.cache(false) {
+      composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<Text(s...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          Text(s, %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }
+    (%composer, 6)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(s, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testRememberComposableLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testRememberComposableLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..0b28cfa
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testRememberComposableLambda\133useFir = true\135.txt"
@@ -0,0 +1,71 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(s: String) {
+  remember<@Composable () -> Unit> { { Text(s) } }()
+  currentComposer.cache<@Composable () -> Unit>(false) { { Text(s) } }()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(s: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<rememb...>,<rememb...>,<curren...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(s)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    remember({
+      composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<Text(s...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          Text(s, %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }, %composer, 0)(%composer, 6)
+    %composer.cache(false) {
+      composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<Text(s...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          Text(s, %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }
+    (%composer, 6)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(s, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testStateDelegateCapture\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testStateDelegateCapture\133useFir = false\135.txt"
new file mode 100644
index 0000000..60c8034
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testStateDelegateCapture\133useFir = false\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.getValue
+
+@Composable fun A() {
+    val x by mutableStateOf("abc")
+    B {
+        print(x)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val x by {
+      val x%delegate = mutableStateOf(
+        value = "abc"
+      )
+      get() {
+        return x%delegate.getValue(null, ::x%delegate)
+      }
+    }
+    B(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        print(<get-x>())
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testStateDelegateCapture\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testStateDelegateCapture\133useFir = true\135.txt"
new file mode 100644
index 0000000..60c8034
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testStateDelegateCapture\133useFir = true\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.getValue
+
+@Composable fun A() {
+    val x by mutableStateOf("abc")
+    B {
+        print(x)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun A(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(A)<B>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val x by {
+      val x%delegate = mutableStateOf(
+        value = "abc"
+      )
+      get() {
+        return x%delegate.getValue(null, ::x%delegate)
+      }
+    }
+    B(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        print(<get-x>())
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    A(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testTopLevelComposableLambdaProperties\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testTopLevelComposableLambdaProperties\133useFir = false\135.txt"
new file mode 100644
index 0000000..8185a83
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testTopLevelComposableLambdaProperties\133useFir = false\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+val foo = @Composable {}
+val bar: @Composable () -> Unit = {}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val foo: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+val bar: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-2
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testTopLevelComposableLambdaProperties\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testTopLevelComposableLambdaProperties\133useFir = true\135.txt"
new file mode 100644
index 0000000..8185a83
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LambdaMemoizationTransformTests/testTopLevelComposableLambdaProperties\133useFir = true\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+val foo = @Composable {}
+val bar: @Composable () -> Unit = {}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val foo: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+val bar: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-2
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testAnonymousClass\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testAnonymousClass\133useFir = false\135.txt"
new file mode 100644
index 0000000..9b4dc70
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testAnonymousClass\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+interface Foo { fun bar(): Int }
+fun a(): Foo {
+    return object : Foo {
+        override fun bar(): Int { return 1 }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Foo {
+  abstract fun bar(): Int
+}
+fun a(): Foo {
+  return object : Foo {
+    override fun bar(): Int {
+      return LiveLiterals%TestKt.Int%fun-bar%class-%no-name-provided%%fun-a()
+    }
+  }
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val Int%fun-bar%class-%no-name-provided%%fun-a: Int = 1
+  var State%Int%fun-bar%class-%no-name-provided%%fun-a: State<Int>?
+  @LiveLiteralInfo(key = "Int%fun-bar%class-%no-name-provided%%fun-a", offset = 159)
+  fun Int%fun-bar%class-%no-name-provided%%fun-a(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%fun-bar%class-%no-name-provided%%fun-a
+    }
+    val tmp0 = State%Int%fun-bar%class-%no-name-provided%%fun-a
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%fun-bar%class-%no-name-provided%%fun-a", Int%fun-bar%class-%no-name-provided%%fun-a)
+      State%Int%fun-bar%class-%no-name-provided%%fun-a = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testAnonymousClass\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testAnonymousClass\133useFir = true\135.txt"
new file mode 100644
index 0000000..9b4dc70
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testAnonymousClass\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+interface Foo { fun bar(): Int }
+fun a(): Foo {
+    return object : Foo {
+        override fun bar(): Int { return 1 }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Foo {
+  abstract fun bar(): Int
+}
+fun a(): Foo {
+  return object : Foo {
+    override fun bar(): Int {
+      return LiveLiterals%TestKt.Int%fun-bar%class-%no-name-provided%%fun-a()
+    }
+  }
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val Int%fun-bar%class-%no-name-provided%%fun-a: Int = 1
+  var State%Int%fun-bar%class-%no-name-provided%%fun-a: State<Int>?
+  @LiveLiteralInfo(key = "Int%fun-bar%class-%no-name-provided%%fun-a", offset = 159)
+  fun Int%fun-bar%class-%no-name-provided%%fun-a(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%fun-bar%class-%no-name-provided%%fun-a
+    }
+    val tmp0 = State%Int%fun-bar%class-%no-name-provided%%fun-a
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%fun-bar%class-%no-name-provided%%fun-a", Int%fun-bar%class-%no-name-provided%%fun-a)
+      State%Int%fun-bar%class-%no-name-provided%%fun-a = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransformConstantFoldingK1\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransformConstantFoldingK1\133useFir = false\135.txt"
new file mode 100644
index 0000000..a61cac2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransformConstantFoldingK1\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+    fun A() {
+        print(3 + 4)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() {
+  print(LiveLiterals%TestKt.Int%%this%call-plus%arg-0%call-print%fun-A() + LiveLiterals%TestKt.Int%arg-0%call-plus%arg-0%call-print%fun-A())
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val Int%%this%call-plus%arg-0%call-print%fun-A: Int = 3
+  var State%Int%%this%call-plus%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%%this%call-plus%arg-0%call-print%fun-A", offset = 72)
+  fun Int%%this%call-plus%arg-0%call-print%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%%this%call-plus%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%%this%call-plus%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%%this%call-plus%arg-0%call-print%fun-A", Int%%this%call-plus%arg-0%call-print%fun-A)
+      State%Int%%this%call-plus%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-plus%arg-0%call-print%fun-A: Int = 4
+  var State%Int%arg-0%call-plus%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-plus%arg-0%call-print%fun-A", offset = 76)
+  fun Int%arg-0%call-plus%arg-0%call-print%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%arg-0%call-plus%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-plus%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-plus%arg-0%call-print%fun-A", Int%arg-0%call-plus%arg-0%call-print%fun-A)
+      State%Int%arg-0%call-plus%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransformConstantFoldingK2\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransformConstantFoldingK2\133useFir = true\135.txt"
new file mode 100644
index 0000000..bc57096
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransformConstantFoldingK2\133useFir = true\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+    fun A() {
+        print(3 + 4)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() {
+  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val Int%arg-0%call-print%fun-A: Int = 7
+  var State%Int%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 74)
+  fun Int%arg-0%call-print%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
+      State%Int%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransform\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransform\133useFir = false\135.txt"
new file mode 100644
index 0000000..a35baf3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransform\133useFir = false\135.txt"
@@ -0,0 +1,155 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+    fun A() {
+      print(1)
+      print("Hello World")
+      if (true) {
+        print(4)
+      }
+      if (true) {
+        print(1.0f)
+      }
+      print(3)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() {
+  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
+  print(LiveLiterals%TestKt.String%arg-0%call-print-1%fun-A())
+  if (LiveLiterals%TestKt.Boolean%cond%if%fun-A()) {
+    print(LiveLiterals%TestKt.Int%arg-0%call-print%branch%if%fun-A())
+  }
+  if (LiveLiterals%TestKt.Boolean%cond%if-1%fun-A()) {
+    print(LiveLiterals%TestKt.Float%arg-0%call-print%branch%if-1%fun-A())
+  }
+  print(LiveLiterals%TestKt.Int%arg-0%call-print-2%fun-A())
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val Int%arg-0%call-print%fun-A: Int = 1
+  var State%Int%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 70)
+  fun Int%arg-0%call-print%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
+      State%Int%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%arg-0%call-print-1%fun-A: String = "Hello World"
+  var State%String%arg-0%call-print-1%fun-A: State<String>?
+  @LiveLiteralInfo(key = "String%arg-0%call-print-1%fun-A", offset = 86)
+  fun String%arg-0%call-print-1%fun-A(): String {
+    if (!isLiveLiteralsEnabled) {
+      return String%arg-0%call-print-1%fun-A
+    }
+    val tmp0 = State%String%arg-0%call-print-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%arg-0%call-print-1%fun-A", String%arg-0%call-print-1%fun-A)
+      State%String%arg-0%call-print-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%cond%if%fun-A: Boolean = true
+  var State%Boolean%cond%if%fun-A: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%cond%if%fun-A", offset = 110)
+  fun Boolean%cond%if%fun-A(): Boolean {
+    if (!isLiveLiteralsEnabled) {
+      return Boolean%cond%if%fun-A
+    }
+    val tmp0 = State%Boolean%cond%if%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%cond%if%fun-A", Boolean%cond%if%fun-A)
+      State%Boolean%cond%if%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-print%branch%if%fun-A: Int = 4
+  var State%Int%arg-0%call-print%branch%if%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%branch%if%fun-A", offset = 132)
+  fun Int%arg-0%call-print%branch%if%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%arg-0%call-print%branch%if%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%branch%if%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%branch%if%fun-A", Int%arg-0%call-print%branch%if%fun-A)
+      State%Int%arg-0%call-print%branch%if%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%cond%if-1%fun-A: Boolean = true
+  var State%Boolean%cond%if-1%fun-A: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%cond%if-1%fun-A", offset = 153)
+  fun Boolean%cond%if-1%fun-A(): Boolean {
+    if (!isLiveLiteralsEnabled) {
+      return Boolean%cond%if-1%fun-A
+    }
+    val tmp0 = State%Boolean%cond%if-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%cond%if-1%fun-A", Boolean%cond%if-1%fun-A)
+      State%Boolean%cond%if-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Float%arg-0%call-print%branch%if-1%fun-A: Float = 1.0f
+  var State%Float%arg-0%call-print%branch%if-1%fun-A: State<Float>?
+  @LiveLiteralInfo(key = "Float%arg-0%call-print%branch%if-1%fun-A", offset = 175)
+  fun Float%arg-0%call-print%branch%if-1%fun-A(): Float {
+    if (!isLiveLiteralsEnabled) {
+      return Float%arg-0%call-print%branch%if-1%fun-A
+    }
+    val tmp0 = State%Float%arg-0%call-print%branch%if-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Float%arg-0%call-print%branch%if-1%fun-A", Float%arg-0%call-print%branch%if-1%fun-A)
+      State%Float%arg-0%call-print%branch%if-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-print-2%fun-A: Int = 3
+  var State%Int%arg-0%call-print-2%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print-2%fun-A", offset = 201)
+  fun Int%arg-0%call-print-2%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%arg-0%call-print-2%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print-2%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print-2%fun-A", Int%arg-0%call-print-2%fun-A)
+      State%Int%arg-0%call-print-2%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransform\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransform\133useFir = true\135.txt"
new file mode 100644
index 0000000..e36dae7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testBasicTransform\133useFir = true\135.txt"
@@ -0,0 +1,155 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+    fun A() {
+      print(1)
+      print("Hello World")
+      if (true) {
+        print(4)
+      }
+      if (true) {
+        print(1.0f)
+      }
+      print(3)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() {
+  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
+  print(LiveLiterals%TestKt.String%arg-0%call-print-1%fun-A())
+  if (LiveLiterals%TestKt.Boolean%cond%if%fun-A()) {
+    print(LiveLiterals%TestKt.Int%arg-0%call-print%branch%if%fun-A())
+  }
+  if (LiveLiterals%TestKt.Boolean%cond%if-1%fun-A()) {
+    print(LiveLiterals%TestKt.Float%arg-0%call-print%branch%if-1%fun-A())
+  }
+  print(LiveLiterals%TestKt.Int%arg-0%call-print-2%fun-A())
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val Int%arg-0%call-print%fun-A: Int = 1
+  var State%Int%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 70)
+  fun Int%arg-0%call-print%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
+      State%Int%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%arg-0%call-print-1%fun-A: String = "Hello World"
+  var State%String%arg-0%call-print-1%fun-A: State<String>?
+  @LiveLiteralInfo(key = "String%arg-0%call-print-1%fun-A", offset = 85)
+  fun String%arg-0%call-print-1%fun-A(): String {
+    if (!isLiveLiteralsEnabled) {
+      return String%arg-0%call-print-1%fun-A
+    }
+    val tmp0 = State%String%arg-0%call-print-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%arg-0%call-print-1%fun-A", String%arg-0%call-print-1%fun-A)
+      State%String%arg-0%call-print-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%cond%if%fun-A: Boolean = true
+  var State%Boolean%cond%if%fun-A: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%cond%if%fun-A", offset = 110)
+  fun Boolean%cond%if%fun-A(): Boolean {
+    if (!isLiveLiteralsEnabled) {
+      return Boolean%cond%if%fun-A
+    }
+    val tmp0 = State%Boolean%cond%if%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%cond%if%fun-A", Boolean%cond%if%fun-A)
+      State%Boolean%cond%if%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-print%branch%if%fun-A: Int = 4
+  var State%Int%arg-0%call-print%branch%if%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%branch%if%fun-A", offset = 132)
+  fun Int%arg-0%call-print%branch%if%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%arg-0%call-print%branch%if%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%branch%if%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%branch%if%fun-A", Int%arg-0%call-print%branch%if%fun-A)
+      State%Int%arg-0%call-print%branch%if%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%cond%if-1%fun-A: Boolean = true
+  var State%Boolean%cond%if-1%fun-A: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%cond%if-1%fun-A", offset = 153)
+  fun Boolean%cond%if-1%fun-A(): Boolean {
+    if (!isLiveLiteralsEnabled) {
+      return Boolean%cond%if-1%fun-A
+    }
+    val tmp0 = State%Boolean%cond%if-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%cond%if-1%fun-A", Boolean%cond%if-1%fun-A)
+      State%Boolean%cond%if-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Float%arg-0%call-print%branch%if-1%fun-A: Float = 1.0f
+  var State%Float%arg-0%call-print%branch%if-1%fun-A: State<Float>?
+  @LiveLiteralInfo(key = "Float%arg-0%call-print%branch%if-1%fun-A", offset = 175)
+  fun Float%arg-0%call-print%branch%if-1%fun-A(): Float {
+    if (!isLiveLiteralsEnabled) {
+      return Float%arg-0%call-print%branch%if-1%fun-A
+    }
+    val tmp0 = State%Float%arg-0%call-print%branch%if-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Float%arg-0%call-print%branch%if-1%fun-A", Float%arg-0%call-print%branch%if-1%fun-A)
+      State%Float%arg-0%call-print%branch%if-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-print-2%fun-A: Int = 3
+  var State%Int%arg-0%call-print-2%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print-2%fun-A", offset = 201)
+  fun Int%arg-0%call-print-2%fun-A(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%arg-0%call-print-2%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print-2%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print-2%fun-A", Int%arg-0%call-print-2%fun-A)
+      State%Int%arg-0%call-print-2%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt"
new file mode 100644
index 0000000..e5cb0f9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt"
@@ -0,0 +1,173 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.runtime.*
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.material.*
+
+object Ui {}
+
+@Composable
+fun Ui.UiTextField(
+    isError: Boolean = false,
+    keyboardActions2: Boolean = false,
+) {
+    println("t41 insideFunction $isError")
+    println("t41 insideFunction $keyboardActions2")
+    Column {
+        Text("$isError")
+        Text("$keyboardActions2")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object Ui {
+  static val %stable: Int = LiveLiterals%TestKt.Int%class-Ui()
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(UiTextField)")
+  val %dirty = %changed
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(isError)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        isError = LiveLiterals%TestKt.Boolean%param-isError%fun-UiTextField()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        keyboardActions2 = LiveLiterals%TestKt.Boolean%param-keyboardActions2%fun-UiTextField()
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println%fun-UiTextField()}%isError")
+    println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println-1%fun-UiTextField()}%keyboardActions2")
+    Column(null, null, null, { %composer: Composer?, %changed: Int ->
+      Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+      Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+    }, %composer, 0, 0b0111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val Int%class-Ui: Int = 0
+  var State%Int%class-Ui: State<Int>?
+  @LiveLiteralInfo(key = "Int%class-Ui", offset = -1)
+  fun Int%class-Ui(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%class-Ui
+    }
+    val tmp0 = State%Int%class-Ui
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%class-Ui", Int%class-Ui)
+      State%Int%class-Ui = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%param-isError%fun-UiTextField: Boolean = false
+  var State%Boolean%param-isError%fun-UiTextField: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%param-isError%fun-UiTextField", offset = 292)
+  fun Boolean%param-isError%fun-UiTextField(): Boolean {
+    if (!isLiveLiteralsEnabled) {
+      return Boolean%param-isError%fun-UiTextField
+    }
+    val tmp0 = State%Boolean%param-isError%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%param-isError%fun-UiTextField", Boolean%param-isError%fun-UiTextField)
+      State%Boolean%param-isError%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%param-keyboardActions2%fun-UiTextField: Boolean = false
+  var State%Boolean%param-keyboardActions2%fun-UiTextField: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%param-keyboardActions2%fun-UiTextField", offset = 331)
+  fun Boolean%param-keyboardActions2%fun-UiTextField(): Boolean {
+    if (!isLiveLiteralsEnabled) {
+      return Boolean%param-keyboardActions2%fun-UiTextField
+    }
+    val tmp0 = State%Boolean%param-keyboardActions2%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%param-keyboardActions2%fun-UiTextField", Boolean%param-keyboardActions2%fun-UiTextField)
+      State%Boolean%param-keyboardActions2%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%0%str%arg-0%call-println%fun-UiTextField: String = "t41 insideFunction "
+  var State%String%0%str%arg-0%call-println%fun-UiTextField: State<String>?
+  @LiveLiteralInfo(key = "String%0%str%arg-0%call-println%fun-UiTextField", offset = 355)
+  fun String%0%str%arg-0%call-println%fun-UiTextField(): String {
+    if (!isLiveLiteralsEnabled) {
+      return String%0%str%arg-0%call-println%fun-UiTextField
+    }
+    val tmp0 = State%String%0%str%arg-0%call-println%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%0%str%arg-0%call-println%fun-UiTextField", String%0%str%arg-0%call-println%fun-UiTextField)
+      State%String%0%str%arg-0%call-println%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%0%str%arg-0%call-println-1%fun-UiTextField: String = "t41 insideFunction "
+  var State%String%0%str%arg-0%call-println-1%fun-UiTextField: State<String>?
+  @LiveLiteralInfo(key = "String%0%str%arg-0%call-println-1%fun-UiTextField", offset = 398)
+  fun String%0%str%arg-0%call-println-1%fun-UiTextField(): String {
+    if (!isLiveLiteralsEnabled) {
+      return String%0%str%arg-0%call-println-1%fun-UiTextField
+    }
+    val tmp0 = State%String%0%str%arg-0%call-println-1%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%0%str%arg-0%call-println-1%fun-UiTextField", String%0%str%arg-0%call-println-1%fun-UiTextField)
+      State%String%0%str%arg-0%call-println-1%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt"
new file mode 100644
index 0000000..e5cb0f9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralTransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt"
@@ -0,0 +1,173 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.runtime.*
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.material.*
+
+object Ui {}
+
+@Composable
+fun Ui.UiTextField(
+    isError: Boolean = false,
+    keyboardActions2: Boolean = false,
+) {
+    println("t41 insideFunction $isError")
+    println("t41 insideFunction $keyboardActions2")
+    Column {
+        Text("$isError")
+        Text("$keyboardActions2")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object Ui {
+  static val %stable: Int = LiveLiterals%TestKt.Int%class-Ui()
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(UiTextField)")
+  val %dirty = %changed
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(isError)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        isError = LiveLiterals%TestKt.Boolean%param-isError%fun-UiTextField()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        keyboardActions2 = LiveLiterals%TestKt.Boolean%param-keyboardActions2%fun-UiTextField()
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println%fun-UiTextField()}%isError")
+    println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println-1%fun-UiTextField()}%keyboardActions2")
+    Column(null, null, null, { %composer: Composer?, %changed: Int ->
+      Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+      Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+    }, %composer, 0, 0b0111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val Int%class-Ui: Int = 0
+  var State%Int%class-Ui: State<Int>?
+  @LiveLiteralInfo(key = "Int%class-Ui", offset = -1)
+  fun Int%class-Ui(): Int {
+    if (!isLiveLiteralsEnabled) {
+      return Int%class-Ui
+    }
+    val tmp0 = State%Int%class-Ui
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%class-Ui", Int%class-Ui)
+      State%Int%class-Ui = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%param-isError%fun-UiTextField: Boolean = false
+  var State%Boolean%param-isError%fun-UiTextField: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%param-isError%fun-UiTextField", offset = 292)
+  fun Boolean%param-isError%fun-UiTextField(): Boolean {
+    if (!isLiveLiteralsEnabled) {
+      return Boolean%param-isError%fun-UiTextField
+    }
+    val tmp0 = State%Boolean%param-isError%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%param-isError%fun-UiTextField", Boolean%param-isError%fun-UiTextField)
+      State%Boolean%param-isError%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%param-keyboardActions2%fun-UiTextField: Boolean = false
+  var State%Boolean%param-keyboardActions2%fun-UiTextField: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%param-keyboardActions2%fun-UiTextField", offset = 331)
+  fun Boolean%param-keyboardActions2%fun-UiTextField(): Boolean {
+    if (!isLiveLiteralsEnabled) {
+      return Boolean%param-keyboardActions2%fun-UiTextField
+    }
+    val tmp0 = State%Boolean%param-keyboardActions2%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%param-keyboardActions2%fun-UiTextField", Boolean%param-keyboardActions2%fun-UiTextField)
+      State%Boolean%param-keyboardActions2%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%0%str%arg-0%call-println%fun-UiTextField: String = "t41 insideFunction "
+  var State%String%0%str%arg-0%call-println%fun-UiTextField: State<String>?
+  @LiveLiteralInfo(key = "String%0%str%arg-0%call-println%fun-UiTextField", offset = 355)
+  fun String%0%str%arg-0%call-println%fun-UiTextField(): String {
+    if (!isLiveLiteralsEnabled) {
+      return String%0%str%arg-0%call-println%fun-UiTextField
+    }
+    val tmp0 = State%String%0%str%arg-0%call-println%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%0%str%arg-0%call-println%fun-UiTextField", String%0%str%arg-0%call-println%fun-UiTextField)
+      State%String%0%str%arg-0%call-println%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%0%str%arg-0%call-println-1%fun-UiTextField: String = "t41 insideFunction "
+  var State%String%0%str%arg-0%call-println-1%fun-UiTextField: State<String>?
+  @LiveLiteralInfo(key = "String%0%str%arg-0%call-println-1%fun-UiTextField", offset = 398)
+  fun String%0%str%arg-0%call-println-1%fun-UiTextField(): String {
+    if (!isLiveLiteralsEnabled) {
+      return String%0%str%arg-0%call-println-1%fun-UiTextField
+    }
+    val tmp0 = State%String%0%str%arg-0%call-println-1%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%0%str%arg-0%call-println-1%fun-UiTextField", String%0%str%arg-0%call-println-1%fun-UiTextField)
+      State%String%0%str%arg-0%call-println-1%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testAnonymousClass\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testAnonymousClass\133useFir = false\135.txt"
new file mode 100644
index 0000000..84747ea
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testAnonymousClass\133useFir = false\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+interface Foo { fun bar(): Int }
+fun a(): Foo {
+    return object : Foo {
+        override fun bar(): Int { return 1 }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Foo {
+  abstract fun bar(): Int
+}
+fun a(): Foo {
+  return object : Foo {
+    override fun bar(): Int {
+      return LiveLiterals%TestKt.Int%fun-bar%class-%no-name-provided%%fun-a()
+    }
+  }
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val enabled: Boolean = false
+  val Int%fun-bar%class-%no-name-provided%%fun-a: Int = 1
+  var State%Int%fun-bar%class-%no-name-provided%%fun-a: State<Int>?
+  @LiveLiteralInfo(key = "Int%fun-bar%class-%no-name-provided%%fun-a", offset = 159)
+  fun Int%fun-bar%class-%no-name-provided%%fun-a(): Int {
+    if (!enabled) {
+      return Int%fun-bar%class-%no-name-provided%%fun-a
+    }
+    val tmp0 = State%Int%fun-bar%class-%no-name-provided%%fun-a
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%fun-bar%class-%no-name-provided%%fun-a", Int%fun-bar%class-%no-name-provided%%fun-a)
+      State%Int%fun-bar%class-%no-name-provided%%fun-a = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testAnonymousClass\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testAnonymousClass\133useFir = true\135.txt"
new file mode 100644
index 0000000..84747ea
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testAnonymousClass\133useFir = true\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+interface Foo { fun bar(): Int }
+fun a(): Foo {
+    return object : Foo {
+        override fun bar(): Int { return 1 }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface Foo {
+  abstract fun bar(): Int
+}
+fun a(): Foo {
+  return object : Foo {
+    override fun bar(): Int {
+      return LiveLiterals%TestKt.Int%fun-bar%class-%no-name-provided%%fun-a()
+    }
+  }
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val enabled: Boolean = false
+  val Int%fun-bar%class-%no-name-provided%%fun-a: Int = 1
+  var State%Int%fun-bar%class-%no-name-provided%%fun-a: State<Int>?
+  @LiveLiteralInfo(key = "Int%fun-bar%class-%no-name-provided%%fun-a", offset = 159)
+  fun Int%fun-bar%class-%no-name-provided%%fun-a(): Int {
+    if (!enabled) {
+      return Int%fun-bar%class-%no-name-provided%%fun-a
+    }
+    val tmp0 = State%Int%fun-bar%class-%no-name-provided%%fun-a
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%fun-bar%class-%no-name-provided%%fun-a", Int%fun-bar%class-%no-name-provided%%fun-a)
+      State%Int%fun-bar%class-%no-name-provided%%fun-a = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransformConstantFoldingK1\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransformConstantFoldingK1\133useFir = false\135.txt"
new file mode 100644
index 0000000..5f86a83
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransformConstantFoldingK1\133useFir = false\135.txt"
@@ -0,0 +1,55 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+    fun A() {
+        print(3 + 4)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() {
+  print(LiveLiterals%TestKt.Int%%this%call-plus%arg-0%call-print%fun-A() + LiveLiterals%TestKt.Int%arg-0%call-plus%arg-0%call-print%fun-A())
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val enabled: Boolean = false
+  val Int%%this%call-plus%arg-0%call-print%fun-A: Int = 3
+  var State%Int%%this%call-plus%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%%this%call-plus%arg-0%call-print%fun-A", offset = 72)
+  fun Int%%this%call-plus%arg-0%call-print%fun-A(): Int {
+    if (!enabled) {
+      return Int%%this%call-plus%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%%this%call-plus%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%%this%call-plus%arg-0%call-print%fun-A", Int%%this%call-plus%arg-0%call-print%fun-A)
+      State%Int%%this%call-plus%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-plus%arg-0%call-print%fun-A: Int = 4
+  var State%Int%arg-0%call-plus%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-plus%arg-0%call-print%fun-A", offset = 76)
+  fun Int%arg-0%call-plus%arg-0%call-print%fun-A(): Int {
+    if (!enabled) {
+      return Int%arg-0%call-plus%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-plus%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-plus%arg-0%call-print%fun-A", Int%arg-0%call-plus%arg-0%call-print%fun-A)
+      State%Int%arg-0%call-plus%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransformConstantFoldingK2\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransformConstantFoldingK2\133useFir = true\135.txt"
new file mode 100644
index 0000000..2257250
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransformConstantFoldingK2\133useFir = true\135.txt"
@@ -0,0 +1,38 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+    fun A() {
+        print(3 + 4)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() {
+  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val enabled: Boolean = false
+  val Int%arg-0%call-print%fun-A: Int = 7
+  var State%Int%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 74)
+  fun Int%arg-0%call-print%fun-A(): Int {
+    if (!enabled) {
+      return Int%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
+      State%Int%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransform\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransform\133useFir = false\135.txt"
new file mode 100644
index 0000000..68dfcf2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransform\133useFir = false\135.txt"
@@ -0,0 +1,156 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+    fun A() {
+      print(1)
+      print("Hello World")
+      if (true) {
+        print(7)
+      }
+      if (true) {
+        print(1.0f)
+      }
+      print(3)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() {
+  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
+  print(LiveLiterals%TestKt.String%arg-0%call-print-1%fun-A())
+  if (LiveLiterals%TestKt.Boolean%cond%if%fun-A()) {
+    print(LiveLiterals%TestKt.Int%arg-0%call-print%branch%if%fun-A())
+  }
+  if (LiveLiterals%TestKt.Boolean%cond%if-1%fun-A()) {
+    print(LiveLiterals%TestKt.Float%arg-0%call-print%branch%if-1%fun-A())
+  }
+  print(LiveLiterals%TestKt.Int%arg-0%call-print-2%fun-A())
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val enabled: Boolean = false
+  val Int%arg-0%call-print%fun-A: Int = 1
+  var State%Int%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 70)
+  fun Int%arg-0%call-print%fun-A(): Int {
+    if (!enabled) {
+      return Int%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
+      State%Int%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%arg-0%call-print-1%fun-A: String = "Hello World"
+  var State%String%arg-0%call-print-1%fun-A: State<String>?
+  @LiveLiteralInfo(key = "String%arg-0%call-print-1%fun-A", offset = 86)
+  fun String%arg-0%call-print-1%fun-A(): String {
+    if (!enabled) {
+      return String%arg-0%call-print-1%fun-A
+    }
+    val tmp0 = State%String%arg-0%call-print-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%arg-0%call-print-1%fun-A", String%arg-0%call-print-1%fun-A)
+      State%String%arg-0%call-print-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%cond%if%fun-A: Boolean = true
+  var State%Boolean%cond%if%fun-A: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%cond%if%fun-A", offset = 110)
+  fun Boolean%cond%if%fun-A(): Boolean {
+    if (!enabled) {
+      return Boolean%cond%if%fun-A
+    }
+    val tmp0 = State%Boolean%cond%if%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%cond%if%fun-A", Boolean%cond%if%fun-A)
+      State%Boolean%cond%if%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-print%branch%if%fun-A: Int = 7
+  var State%Int%arg-0%call-print%branch%if%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%branch%if%fun-A", offset = 132)
+  fun Int%arg-0%call-print%branch%if%fun-A(): Int {
+    if (!enabled) {
+      return Int%arg-0%call-print%branch%if%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%branch%if%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%branch%if%fun-A", Int%arg-0%call-print%branch%if%fun-A)
+      State%Int%arg-0%call-print%branch%if%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%cond%if-1%fun-A: Boolean = true
+  var State%Boolean%cond%if-1%fun-A: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%cond%if-1%fun-A", offset = 153)
+  fun Boolean%cond%if-1%fun-A(): Boolean {
+    if (!enabled) {
+      return Boolean%cond%if-1%fun-A
+    }
+    val tmp0 = State%Boolean%cond%if-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%cond%if-1%fun-A", Boolean%cond%if-1%fun-A)
+      State%Boolean%cond%if-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Float%arg-0%call-print%branch%if-1%fun-A: Float = 1.0f
+  var State%Float%arg-0%call-print%branch%if-1%fun-A: State<Float>?
+  @LiveLiteralInfo(key = "Float%arg-0%call-print%branch%if-1%fun-A", offset = 175)
+  fun Float%arg-0%call-print%branch%if-1%fun-A(): Float {
+    if (!enabled) {
+      return Float%arg-0%call-print%branch%if-1%fun-A
+    }
+    val tmp0 = State%Float%arg-0%call-print%branch%if-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Float%arg-0%call-print%branch%if-1%fun-A", Float%arg-0%call-print%branch%if-1%fun-A)
+      State%Float%arg-0%call-print%branch%if-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-print-2%fun-A: Int = 3
+  var State%Int%arg-0%call-print-2%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print-2%fun-A", offset = 201)
+  fun Int%arg-0%call-print-2%fun-A(): Int {
+    if (!enabled) {
+      return Int%arg-0%call-print-2%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print-2%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print-2%fun-A", Int%arg-0%call-print-2%fun-A)
+      State%Int%arg-0%call-print-2%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransform\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransform\133useFir = true\135.txt"
new file mode 100644
index 0000000..3a6be0a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testBasicTransform\133useFir = true\135.txt"
@@ -0,0 +1,156 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+    fun A() {
+      print(1)
+      print("Hello World")
+      if (true) {
+        print(7)
+      }
+      if (true) {
+        print(1.0f)
+      }
+      print(3)
+    }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+fun A() {
+  print(LiveLiterals%TestKt.Int%arg-0%call-print%fun-A())
+  print(LiveLiterals%TestKt.String%arg-0%call-print-1%fun-A())
+  if (LiveLiterals%TestKt.Boolean%cond%if%fun-A()) {
+    print(LiveLiterals%TestKt.Int%arg-0%call-print%branch%if%fun-A())
+  }
+  if (LiveLiterals%TestKt.Boolean%cond%if-1%fun-A()) {
+    print(LiveLiterals%TestKt.Float%arg-0%call-print%branch%if-1%fun-A())
+  }
+  print(LiveLiterals%TestKt.Int%arg-0%call-print-2%fun-A())
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val enabled: Boolean = false
+  val Int%arg-0%call-print%fun-A: Int = 1
+  var State%Int%arg-0%call-print%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%fun-A", offset = 70)
+  fun Int%arg-0%call-print%fun-A(): Int {
+    if (!enabled) {
+      return Int%arg-0%call-print%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%fun-A", Int%arg-0%call-print%fun-A)
+      State%Int%arg-0%call-print%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%arg-0%call-print-1%fun-A: String = "Hello World"
+  var State%String%arg-0%call-print-1%fun-A: State<String>?
+  @LiveLiteralInfo(key = "String%arg-0%call-print-1%fun-A", offset = 85)
+  fun String%arg-0%call-print-1%fun-A(): String {
+    if (!enabled) {
+      return String%arg-0%call-print-1%fun-A
+    }
+    val tmp0 = State%String%arg-0%call-print-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%arg-0%call-print-1%fun-A", String%arg-0%call-print-1%fun-A)
+      State%String%arg-0%call-print-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%cond%if%fun-A: Boolean = true
+  var State%Boolean%cond%if%fun-A: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%cond%if%fun-A", offset = 110)
+  fun Boolean%cond%if%fun-A(): Boolean {
+    if (!enabled) {
+      return Boolean%cond%if%fun-A
+    }
+    val tmp0 = State%Boolean%cond%if%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%cond%if%fun-A", Boolean%cond%if%fun-A)
+      State%Boolean%cond%if%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-print%branch%if%fun-A: Int = 7
+  var State%Int%arg-0%call-print%branch%if%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print%branch%if%fun-A", offset = 132)
+  fun Int%arg-0%call-print%branch%if%fun-A(): Int {
+    if (!enabled) {
+      return Int%arg-0%call-print%branch%if%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print%branch%if%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print%branch%if%fun-A", Int%arg-0%call-print%branch%if%fun-A)
+      State%Int%arg-0%call-print%branch%if%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%cond%if-1%fun-A: Boolean = true
+  var State%Boolean%cond%if-1%fun-A: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%cond%if-1%fun-A", offset = 153)
+  fun Boolean%cond%if-1%fun-A(): Boolean {
+    if (!enabled) {
+      return Boolean%cond%if-1%fun-A
+    }
+    val tmp0 = State%Boolean%cond%if-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%cond%if-1%fun-A", Boolean%cond%if-1%fun-A)
+      State%Boolean%cond%if-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Float%arg-0%call-print%branch%if-1%fun-A: Float = 1.0f
+  var State%Float%arg-0%call-print%branch%if-1%fun-A: State<Float>?
+  @LiveLiteralInfo(key = "Float%arg-0%call-print%branch%if-1%fun-A", offset = 175)
+  fun Float%arg-0%call-print%branch%if-1%fun-A(): Float {
+    if (!enabled) {
+      return Float%arg-0%call-print%branch%if-1%fun-A
+    }
+    val tmp0 = State%Float%arg-0%call-print%branch%if-1%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Float%arg-0%call-print%branch%if-1%fun-A", Float%arg-0%call-print%branch%if-1%fun-A)
+      State%Float%arg-0%call-print%branch%if-1%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Int%arg-0%call-print-2%fun-A: Int = 3
+  var State%Int%arg-0%call-print-2%fun-A: State<Int>?
+  @LiveLiteralInfo(key = "Int%arg-0%call-print-2%fun-A", offset = 201)
+  fun Int%arg-0%call-print-2%fun-A(): Int {
+    if (!enabled) {
+      return Int%arg-0%call-print-2%fun-A
+    }
+    val tmp0 = State%Int%arg-0%call-print-2%fun-A
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%arg-0%call-print-2%fun-A", Int%arg-0%call-print-2%fun-A)
+      State%Int%arg-0%call-print-2%fun-A = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt"
new file mode 100644
index 0000000..2735eca
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = false\135.txt"
@@ -0,0 +1,174 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.runtime.*
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.material.*
+
+object Ui {}
+
+@Composable
+fun Ui.UiTextField(
+    isError: Boolean = false,
+    keyboardActions2: Boolean = false,
+) {
+    println("t41 insideFunction $isError")
+    println("t41 insideFunction $keyboardActions2")
+    Column {
+        Text("$isError")
+        Text("$keyboardActions2")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object Ui {
+  static val %stable: Int = LiveLiterals%TestKt.Int%class-Ui()
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(UiTextField)")
+  val %dirty = %changed
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(isError)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        isError = LiveLiterals%TestKt.Boolean%param-isError%fun-UiTextField()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        keyboardActions2 = LiveLiterals%TestKt.Boolean%param-keyboardActions2%fun-UiTextField()
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println%fun-UiTextField()}%isError")
+    println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println-1%fun-UiTextField()}%keyboardActions2")
+    Column(null, null, null, { %composer: Composer?, %changed: Int ->
+      Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+      Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+    }, %composer, 0, 0b0111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val enabled: Boolean = false
+  val Int%class-Ui: Int = 0
+  var State%Int%class-Ui: State<Int>?
+  @LiveLiteralInfo(key = "Int%class-Ui", offset = -1)
+  fun Int%class-Ui(): Int {
+    if (!enabled) {
+      return Int%class-Ui
+    }
+    val tmp0 = State%Int%class-Ui
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%class-Ui", Int%class-Ui)
+      State%Int%class-Ui = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%param-isError%fun-UiTextField: Boolean = false
+  var State%Boolean%param-isError%fun-UiTextField: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%param-isError%fun-UiTextField", offset = 292)
+  fun Boolean%param-isError%fun-UiTextField(): Boolean {
+    if (!enabled) {
+      return Boolean%param-isError%fun-UiTextField
+    }
+    val tmp0 = State%Boolean%param-isError%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%param-isError%fun-UiTextField", Boolean%param-isError%fun-UiTextField)
+      State%Boolean%param-isError%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%param-keyboardActions2%fun-UiTextField: Boolean = false
+  var State%Boolean%param-keyboardActions2%fun-UiTextField: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%param-keyboardActions2%fun-UiTextField", offset = 331)
+  fun Boolean%param-keyboardActions2%fun-UiTextField(): Boolean {
+    if (!enabled) {
+      return Boolean%param-keyboardActions2%fun-UiTextField
+    }
+    val tmp0 = State%Boolean%param-keyboardActions2%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%param-keyboardActions2%fun-UiTextField", Boolean%param-keyboardActions2%fun-UiTextField)
+      State%Boolean%param-keyboardActions2%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%0%str%arg-0%call-println%fun-UiTextField: String = "t41 insideFunction "
+  var State%String%0%str%arg-0%call-println%fun-UiTextField: State<String>?
+  @LiveLiteralInfo(key = "String%0%str%arg-0%call-println%fun-UiTextField", offset = 355)
+  fun String%0%str%arg-0%call-println%fun-UiTextField(): String {
+    if (!enabled) {
+      return String%0%str%arg-0%call-println%fun-UiTextField
+    }
+    val tmp0 = State%String%0%str%arg-0%call-println%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%0%str%arg-0%call-println%fun-UiTextField", String%0%str%arg-0%call-println%fun-UiTextField)
+      State%String%0%str%arg-0%call-println%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%0%str%arg-0%call-println-1%fun-UiTextField: String = "t41 insideFunction "
+  var State%String%0%str%arg-0%call-println-1%fun-UiTextField: State<String>?
+  @LiveLiteralInfo(key = "String%0%str%arg-0%call-println-1%fun-UiTextField", offset = 398)
+  fun String%0%str%arg-0%call-println-1%fun-UiTextField(): String {
+    if (!enabled) {
+      return String%0%str%arg-0%call-println-1%fun-UiTextField
+    }
+    val tmp0 = State%String%0%str%arg-0%call-println-1%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%0%str%arg-0%call-println-1%fun-UiTextField", String%0%str%arg-0%call-println-1%fun-UiTextField)
+      State%String%0%str%arg-0%call-println-1%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt"
new file mode 100644
index 0000000..2735eca
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.LiveLiteralV2TransformTests/testComposeIrSkippingWithDefaultsRelease\133useFir = true\135.txt"
@@ -0,0 +1,174 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.runtime.*
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.material.*
+
+object Ui {}
+
+@Composable
+fun Ui.UiTextField(
+    isError: Boolean = false,
+    keyboardActions2: Boolean = false,
+) {
+    println("t41 insideFunction $isError")
+    println("t41 insideFunction $keyboardActions2")
+    Column {
+        Text("$isError")
+        Text("$keyboardActions2")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+object Ui {
+  static val %stable: Int = LiveLiterals%TestKt.Int%class-Ui()
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Ui.UiTextField(isError: Boolean, keyboardActions2: Boolean, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(UiTextField)")
+  val %dirty = %changed
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(isError)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(keyboardActions2)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011010001 != 0b10010000 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        isError = LiveLiterals%TestKt.Boolean%param-isError%fun-UiTextField()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        keyboardActions2 = LiveLiterals%TestKt.Boolean%param-keyboardActions2%fun-UiTextField()
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println%fun-UiTextField()}%isError")
+    println("%{LiveLiterals%TestKt.String%0%str%arg-0%call-println-1%fun-UiTextField()}%keyboardActions2")
+    Column(null, null, null, { %composer: Composer?, %changed: Int ->
+      Text("%isError", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+      Text("%keyboardActions2", null, <unsafe-coerce>(0L), <unsafe-coerce>(0L), null, null, null, <unsafe-coerce>(0L), null, null, <unsafe-coerce>(0L), <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0, 0, 0b00011111111111111110)
+    }, %composer, 0, 0b0111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    UiTextField(isError, keyboardActions2, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@LiveLiteralFileInfo(file = "/Test.kt")
+internal object LiveLiterals%TestKt {
+  val enabled: Boolean = false
+  val Int%class-Ui: Int = 0
+  var State%Int%class-Ui: State<Int>?
+  @LiveLiteralInfo(key = "Int%class-Ui", offset = -1)
+  fun Int%class-Ui(): Int {
+    if (!enabled) {
+      return Int%class-Ui
+    }
+    val tmp0 = State%Int%class-Ui
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Int%class-Ui", Int%class-Ui)
+      State%Int%class-Ui = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%param-isError%fun-UiTextField: Boolean = false
+  var State%Boolean%param-isError%fun-UiTextField: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%param-isError%fun-UiTextField", offset = 292)
+  fun Boolean%param-isError%fun-UiTextField(): Boolean {
+    if (!enabled) {
+      return Boolean%param-isError%fun-UiTextField
+    }
+    val tmp0 = State%Boolean%param-isError%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%param-isError%fun-UiTextField", Boolean%param-isError%fun-UiTextField)
+      State%Boolean%param-isError%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val Boolean%param-keyboardActions2%fun-UiTextField: Boolean = false
+  var State%Boolean%param-keyboardActions2%fun-UiTextField: State<Boolean>?
+  @LiveLiteralInfo(key = "Boolean%param-keyboardActions2%fun-UiTextField", offset = 331)
+  fun Boolean%param-keyboardActions2%fun-UiTextField(): Boolean {
+    if (!enabled) {
+      return Boolean%param-keyboardActions2%fun-UiTextField
+    }
+    val tmp0 = State%Boolean%param-keyboardActions2%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("Boolean%param-keyboardActions2%fun-UiTextField", Boolean%param-keyboardActions2%fun-UiTextField)
+      State%Boolean%param-keyboardActions2%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%0%str%arg-0%call-println%fun-UiTextField: String = "t41 insideFunction "
+  var State%String%0%str%arg-0%call-println%fun-UiTextField: State<String>?
+  @LiveLiteralInfo(key = "String%0%str%arg-0%call-println%fun-UiTextField", offset = 355)
+  fun String%0%str%arg-0%call-println%fun-UiTextField(): String {
+    if (!enabled) {
+      return String%0%str%arg-0%call-println%fun-UiTextField
+    }
+    val tmp0 = State%String%0%str%arg-0%call-println%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%0%str%arg-0%call-println%fun-UiTextField", String%0%str%arg-0%call-println%fun-UiTextField)
+      State%String%0%str%arg-0%call-println%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+  val String%0%str%arg-0%call-println-1%fun-UiTextField: String = "t41 insideFunction "
+  var State%String%0%str%arg-0%call-println-1%fun-UiTextField: State<String>?
+  @LiveLiteralInfo(key = "String%0%str%arg-0%call-println-1%fun-UiTextField", offset = 398)
+  fun String%0%str%arg-0%call-println-1%fun-UiTextField(): String {
+    if (!enabled) {
+      return String%0%str%arg-0%call-println-1%fun-UiTextField
+    }
+    val tmp0 = State%String%0%str%arg-0%call-println-1%fun-UiTextField
+    return if (tmp0 == null) {
+      val tmp1 = liveLiteral("String%0%str%arg-0%call-println-1%fun-UiTextField", String%0%str%arg-0%call-println-1%fun-UiTextField)
+      State%String%0%str%arg-0%call-println-1%fun-UiTextField = tmp1
+      tmp1
+    } else {
+      tmp0
+    }
+    .value
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallBeforeRemember\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallBeforeRemember\133useFir = false\135.txt"
new file mode 100644
index 0000000..b120dce
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallBeforeRemember\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    A()
+    val foo = remember { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(%composer, 0)
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallBeforeRemember\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallBeforeRemember\133useFir = true\135.txt"
new file mode 100644
index 0000000..b120dce
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallBeforeRemember\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    A()
+    val foo = remember { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(%composer, 0)
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallInArgument\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallInArgument\133useFir = false\135.txt"
new file mode 100644
index 0000000..09009ec
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallInArgument\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val foo = remember(CInt()) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<CInt()...>:Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(CInt(%composer, 0))) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallInArgument\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallInArgument\133useFir = true\135.txt"
new file mode 100644
index 0000000..09009ec
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testComposableCallInArgument\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val foo = remember(CInt()) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<CInt()...>:Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(CInt(%composer, 0))) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallAsInput\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallAsInput\133useFir = false\135.txt"
new file mode 100644
index 0000000..d78058d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallAsInput\133useFir = false\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val foo = remember(compositionLocalBar.current) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<curren...>:Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(compositionLocalBar.<get-current>(%composer, 0b0110))) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallAsInput\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallAsInput\133useFir = true\135.txt"
new file mode 100644
index 0000000..d78058d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallAsInput\133useFir = true\135.txt"
@@ -0,0 +1,44 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val foo = remember(compositionLocalBar.current) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<curren...>:Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(compositionLocalBar.<get-current>(%composer, 0b0110))) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallBeforeRemember\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallBeforeRemember\133useFir = false\135.txt"
new file mode 100644
index 0000000..50103e6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallBeforeRemember\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val bar = compositionLocalBar.current
+    val foo = remember(bar) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val bar = compositionLocalBar.<get-current>(%composer, 0b0110)
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<curren...>:Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(bar)) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallBeforeRemember\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallBeforeRemember\133useFir = true\135.txt"
new file mode 100644
index 0000000..50103e6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testCompositionLocalCallBeforeRemember\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val bar = compositionLocalBar.current
+    val foo = remember(bar) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val bar = compositionLocalBar.<get-current>(%composer, 0b0110)
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<curren...>:Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(bar)) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testElidedRememberInsideIfDeoptsRememberAfterIf\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testElidedRememberInsideIfDeoptsRememberAfterIf\133useFir = false\135.txt"
new file mode 100644
index 0000000..b700885
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testElidedRememberInsideIfDeoptsRememberAfterIf\133useFir = false\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+import androidx.compose.runtime.NonRestartableComposable
+
+@Composable
+@NonRestartableComposable
+fun app(x: Boolean) {
+    val a = if (x) { remember { 1 } } else { 2 }
+    val b = remember { 2 }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun app(x: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(app):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val a = <block>{
+    %composer.startReplaceableGroup(<>)
+    val tmp1_group = if (x) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(app):Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        1
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    } else {
+      2
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+  }
+  val b = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(app):Test.kt")
+    val tmp2_group = %composer.cache(false) {
+      2
+    }
+    %composer.endReplaceableGroup()
+    tmp2_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testElidedRememberInsideIfDeoptsRememberAfterIf\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testElidedRememberInsideIfDeoptsRememberAfterIf\133useFir = true\135.txt"
new file mode 100644
index 0000000..b700885
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testElidedRememberInsideIfDeoptsRememberAfterIf\133useFir = true\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+import androidx.compose.runtime.NonRestartableComposable
+
+@Composable
+@NonRestartableComposable
+fun app(x: Boolean) {
+    val a = if (x) { remember { 1 } } else { 2 }
+    val b = remember { 2 }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun app(x: Boolean, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(app):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val a = <block>{
+    %composer.startReplaceableGroup(<>)
+    val tmp1_group = if (x) {
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(app):Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        1
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    } else {
+      2
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+  }
+  val b = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(app):Test.kt")
+    val tmp2_group = %composer.cache(false) {
+      2
+    }
+    %composer.endReplaceableGroup()
+    tmp2_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testForEarlyExit\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testForEarlyExit\133useFir = false\135.txt"
new file mode 100644
index 0000000..86187fb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testForEarlyExit\133useFir = false\135.txt"
@@ -0,0 +1,72 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(condition: Boolean) {
+    val value = remember { mutableStateOf(false) }
+    if (!value.value && !condition) return
+    val value2 = remember { mutableStateOf(false) }
+    Text("Text ${value.value}, ${value2.value}")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val value = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        mutableStateOf(
+          value = false
+        )
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (!value.value && !condition) {
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+        Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+      }
+      return
+    }
+    val value2 = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp1_group = %composer.cache(false) {
+        mutableStateOf(
+          value = false
+        )
+      }
+      %composer.endReplaceableGroup()
+      tmp1_group
+    }
+    Text("Text %{value.value}, %{value2.value}", %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testForEarlyExit\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testForEarlyExit\133useFir = true\135.txt"
new file mode 100644
index 0000000..86187fb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testForEarlyExit\133useFir = true\135.txt"
@@ -0,0 +1,72 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(condition: Boolean) {
+    val value = remember { mutableStateOf(false) }
+    if (!value.value && !condition) return
+    val value2 = remember { mutableStateOf(false) }
+    Text("Text ${value.value}, ${value2.value}")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val value = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        mutableStateOf(
+          value = false
+        )
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (!value.value && !condition) {
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+        Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+      }
+      return
+    }
+    val value2 = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp1_group = %composer.cache(false) {
+        mutableStateOf(
+          value = false
+        )
+      }
+      %composer.endReplaceableGroup()
+      tmp1_group
+    }
+    Text("Text %{value.value}, %{value2.value}", %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_AfterComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_AfterComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..3ba59c3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_AfterComposable\133useFir = false\135.txt"
@@ -0,0 +1,93 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = remember { 0 }, b: Int = SomeComposable(), c: Int = remember { 0 }) {
+    used(a)
+    used(b)
+    used(c)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Int, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%default and 0b0100 == 0 && %composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = <block>{
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C(Test)<SomeCo...>:Test.kt")
+          val tmp0_group = %composer.cache(false) {
+            0
+          }
+          %composer.endReplaceableGroup()
+          tmp0_group
+        }
+        %dirty = %dirty and 0b1110.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        b = SomeComposable(%composer, 0)
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0100 != 0) {
+        c = <block>{
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C(Test):Test.kt")
+          val tmp1_group = %composer.cache(false) {
+            0
+          }
+          %composer.endReplaceableGroup()
+          tmp1_group
+        }
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0100 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    used(c)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_AfterComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_AfterComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..3ba59c3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_AfterComposable\133useFir = true\135.txt"
@@ -0,0 +1,93 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = remember { 0 }, b: Int = SomeComposable(), c: Int = remember { 0 }) {
+    used(a)
+    used(b)
+    used(c)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Int, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%default and 0b0100 == 0 && %composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = <block>{
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C(Test)<SomeCo...>:Test.kt")
+          val tmp0_group = %composer.cache(false) {
+            0
+          }
+          %composer.endReplaceableGroup()
+          tmp0_group
+        }
+        %dirty = %dirty and 0b1110.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        b = SomeComposable(%composer, 0)
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0100 != 0) {
+        c = <block>{
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C(Test):Test.kt")
+          val tmp1_group = %composer.cache(false) {
+            0
+          }
+          %composer.endReplaceableGroup()
+          tmp1_group
+        }
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+      if (%default and 0b0100 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    used(c)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_Simple\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_Simple\133useFir = false\135.txt"
new file mode 100644
index 0000000..70318d6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_Simple\133useFir = false\135.txt"
@@ -0,0 +1,61 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = remember { 0 }) {
+    used(a)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = <block>{
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C(Test):Test.kt")
+          val tmp0_group = %composer.cache(false) {
+            0
+          }
+          %composer.endReplaceableGroup()
+          tmp0_group
+        }
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_Simple\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_Simple\133useFir = true\135.txt"
new file mode 100644
index 0000000..70318d6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfDefaultParameters_Simple\133useFir = true\135.txt"
@@ -0,0 +1,61 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = remember { 0 }) {
+    used(a)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = <block>{
+          %composer.startReplaceableGroup(<>)
+          sourceInformation(%composer, "C(Test):Test.kt")
+          val tmp0_group = %composer.cache(false) {
+            0
+          }
+          %composer.endReplaceableGroup()
+          tmp0_group
+        }
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfLambdaInIfBlock\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfLambdaInIfBlock\133useFir = false\135.txt"
new file mode 100644
index 0000000..11f69f4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfLambdaInIfBlock\133useFir = false\135.txt"
@@ -0,0 +1,77 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+    import androidx.compose.runtime.remember
+
+    
+@Composable
+fun Test(a: Boolean, visible: Boolean, onDismiss: () -> Unit) {
+    if (a) {
+        val a = someComposableValue()
+        used(a)
+        val m = Modifier()
+        val dismissModifier = if (visible) {
+            m.pointerInput(Unit) { detectTapGestures { onDismiss() } }
+        } else {
+            m
+        }
+        used(dismissModifier)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Boolean, visible: Boolean, onDismiss: Function0<Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(!1,2)<someCo...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(visible)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(onDismiss)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (a) {
+      val a = someComposableValue(%composer, 0)
+      used(a)
+      val m = Modifier()
+      val dismissModifier = if (visible) {
+        m.pointerInput(Unit, <block>{
+          %composer.startReplaceableGroup(<>)
+          val tmpCache = %composer.cache(%composer.changedInstance(onDismiss)) {
+            {
+              detectTapGestures {
+                onDismiss()
+              }
+            }
+          }
+          %composer.endReplaceableGroup()
+          tmpCache
+        })
+      } else {
+        m
+      }
+      used(dismissModifier)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, visible, onDismiss, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfLambdaInIfBlock\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfLambdaInIfBlock\133useFir = true\135.txt"
new file mode 100644
index 0000000..11f69f4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testIntrinsicRememberOfLambdaInIfBlock\133useFir = true\135.txt"
@@ -0,0 +1,77 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+    import androidx.compose.runtime.remember
+
+    
+@Composable
+fun Test(a: Boolean, visible: Boolean, onDismiss: () -> Unit) {
+    if (a) {
+        val a = someComposableValue()
+        used(a)
+        val m = Modifier()
+        val dismissModifier = if (visible) {
+            m.pointerInput(Unit) { detectTapGestures { onDismiss() } }
+        } else {
+            m
+        }
+        used(dismissModifier)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Boolean, visible: Boolean, onDismiss: Function0<Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(!1,2)<someCo...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(visible)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(onDismiss)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (a) {
+      val a = someComposableValue(%composer, 0)
+      used(a)
+      val m = Modifier()
+      val dismissModifier = if (visible) {
+        m.pointerInput(Unit, <block>{
+          %composer.startReplaceableGroup(<>)
+          val tmpCache = %composer.cache(%composer.changedInstance(onDismiss)) {
+            {
+              detectTapGestures {
+                onDismiss()
+              }
+            }
+          }
+          %composer.endReplaceableGroup()
+          tmpCache
+        })
+      } else {
+        m
+      }
+      used(dismissModifier)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, visible, onDismiss, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleParamInputs\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleParamInputs\133useFir = false\135.txt"
new file mode 100644
index 0000000..9f1eae6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleParamInputs\133useFir = false\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun <T> loadResourceInternal(
+    key: String,
+    pendingResource: T? = null,
+    failedResource: T? = null
+): Boolean {
+    val deferred = remember(key, pendingResource, failedResource) {
+        123
+    }
+    return deferred > 10
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun <T> loadResourceInternal(key: String, pendingResource: T?, failedResource: T?, %composer: Composer?, %changed: Int, %default: Int): Boolean {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(loadResourceInternal)P(1,2):Test.kt")
+  if (%default and 0b0010 != 0) {
+    pendingResource = null
+  }
+  if (%default and 0b0100 != 0) {
+    failedResource = null
+  }
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val deferred = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(loadResourceInternal)P(1,2):Test.kt")
+    val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(key) || %changed and 0b0110 == 0b0100 or %changed and 0b01110000 xor 0b00110000 > 32 && %composer.changed(pendingResource) || %changed and 0b00110000 == 0b00100000 or %changed and 0b001110000000 xor 0b000110000000 > 256 && %composer.changed(failedResource) || %changed and 0b000110000000 == 0b000100000000) {
+      123
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+  }
+  val tmp0 = deferred > 10
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleParamInputs\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleParamInputs\133useFir = true\135.txt"
new file mode 100644
index 0000000..9f1eae6
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleParamInputs\133useFir = true\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun <T> loadResourceInternal(
+    key: String,
+    pendingResource: T? = null,
+    failedResource: T? = null
+): Boolean {
+    val deferred = remember(key, pendingResource, failedResource) {
+        123
+    }
+    return deferred > 10
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun <T> loadResourceInternal(key: String, pendingResource: T?, failedResource: T?, %composer: Composer?, %changed: Int, %default: Int): Boolean {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(loadResourceInternal)P(1,2):Test.kt")
+  if (%default and 0b0010 != 0) {
+    pendingResource = null
+  }
+  if (%default and 0b0100 != 0) {
+    failedResource = null
+  }
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val deferred = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(loadResourceInternal)P(1,2):Test.kt")
+    val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(key) || %changed and 0b0110 == 0b0100 or %changed and 0b01110000 xor 0b00110000 > 32 && %composer.changed(pendingResource) || %changed and 0b00110000 == 0b00100000 or %changed and 0b001110000000 xor 0b000110000000 > 256 && %composer.changed(failedResource) || %changed and 0b000110000000 == 0b000100000000) {
+      123
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+  }
+  val tmp0 = deferred > 10
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleRememberCallsInARow\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleRememberCallsInARow\133useFir = false\135.txt"
new file mode 100644
index 0000000..20c5361
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleRememberCallsInARow\133useFir = false\135.txt"
@@ -0,0 +1,62 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val a = someInt()
+    val b = someInt()
+    val foo = remember(a, b) { Foo(a, b) }
+    val c = someInt()
+    val d = someInt()
+    val bar = remember(c, d) { Foo(c, d) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val a = someInt()
+    val b = someInt()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(a) or %composer.changed(b)) {
+        Foo(a, b)
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    val c = someInt()
+    val d = someInt()
+    val bar = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp1_group = %composer.cache(%composer.changed(c) or %composer.changed(d)) {
+        Foo(c, d)
+      }
+      %composer.endReplaceableGroup()
+      tmp1_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleRememberCallsInARow\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleRememberCallsInARow\133useFir = true\135.txt"
new file mode 100644
index 0000000..20c5361
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testMultipleRememberCallsInARow\133useFir = true\135.txt"
@@ -0,0 +1,62 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val a = someInt()
+    val b = someInt()
+    val foo = remember(a, b) { Foo(a, b) }
+    val c = someInt()
+    val d = someInt()
+    val bar = remember(c, d) { Foo(c, d) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val a = someInt()
+    val b = someInt()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(a) or %composer.changed(b)) {
+        Foo(a, b)
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    val c = someInt()
+    val d = someInt()
+    val bar = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp1_group = %composer.cache(%composer.changed(c) or %composer.changed(d)) {
+        Foo(c, d)
+      }
+      %composer.endReplaceableGroup()
+      tmp1_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNoArgs\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNoArgs\133useFir = false\135.txt"
new file mode 100644
index 0000000..95662bf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNoArgs\133useFir = false\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val foo = remember { Foo() }
+    val bar = remember { Foo() }
+    A()
+    val bam = remember { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    val bar = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp1_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp1_group
+    }
+    A(%composer, 0)
+    val bam = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp2_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp2_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNoArgs\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNoArgs\133useFir = true\135.txt"
new file mode 100644
index 0000000..95662bf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNoArgs\133useFir = true\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val foo = remember { Foo() }
+    val bar = remember { Foo() }
+    A()
+    val bam = remember { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    val bar = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp1_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp1_group
+    }
+    A(%composer, 0)
+    val bam = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp2_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp2_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonArgs\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonArgs\133useFir = false\135.txt"
new file mode 100644
index 0000000..e61afb0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonArgs\133useFir = false\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val a = someInt()
+    val b = someInt()
+    val foo = remember(a, b) { Foo(a, b) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val a = someInt()
+    val b = someInt()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(a) or %composer.changed(b)) {
+        Foo(a, b)
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonArgs\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonArgs\133useFir = true\135.txt"
new file mode 100644
index 0000000..e61afb0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonArgs\133useFir = true\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test() {
+    val a = someInt()
+    val b = someInt()
+    val foo = remember(a, b) { Foo(a, b) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val a = someInt()
+    val b = someInt()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%composer.changed(a) or %composer.changed(b)) {
+        Foo(a, b)
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonRestartableParameterInputsStableUnstableUncertain\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonRestartableParameterInputsStableUnstableUncertain\133useFir = false\135.txt"
new file mode 100644
index 0000000..60a2263
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonRestartableParameterInputsStableUnstableUncertain\133useFir = false\135.txt"
@@ -0,0 +1,90 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+import androidx.compose.runtime.NonRestartableComposable
+
+@Composable
+@NonRestartableComposable
+fun test1(x: KnownStable) {
+    remember(x) { 1 }
+}
+@Composable
+@NonRestartableComposable
+fun test2(x: KnownUnstable) {
+    remember(x) { 1 }
+}
+@Composable
+@NonRestartableComposable
+fun test3(x: Uncertain) {
+    remember(x) { 1 }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun test1(x: KnownStable, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test1):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test1):Test.kt")
+  val tmp0_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(x) || %changed and 0b0110 == 0b0100) {
+    1
+  }
+  %composer.endReplaceableGroup()
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@Composable
+@NonRestartableComposable
+fun test2(x: KnownUnstable, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test2):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test2):Test.kt")
+  val tmp0_group = %composer.cache(%composer.changed(x)) {
+    1
+  }
+  %composer.endReplaceableGroup()
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@Composable
+@NonRestartableComposable
+fun test3(x: Uncertain, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test3):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test3):Test.kt")
+  val tmp0_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(x) || %changed and 0b0110 == 0b0100) {
+    1
+  }
+  %composer.endReplaceableGroup()
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonRestartableParameterInputsStableUnstableUncertain\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonRestartableParameterInputsStableUnstableUncertain\133useFir = true\135.txt"
new file mode 100644
index 0000000..60a2263
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testNonRestartableParameterInputsStableUnstableUncertain\133useFir = true\135.txt"
@@ -0,0 +1,90 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+import androidx.compose.runtime.NonRestartableComposable
+
+@Composable
+@NonRestartableComposable
+fun test1(x: KnownStable) {
+    remember(x) { 1 }
+}
+@Composable
+@NonRestartableComposable
+fun test2(x: KnownUnstable) {
+    remember(x) { 1 }
+}
+@Composable
+@NonRestartableComposable
+fun test3(x: Uncertain) {
+    remember(x) { 1 }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@NonRestartableComposable
+fun test1(x: KnownStable, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test1):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test1):Test.kt")
+  val tmp0_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(x) || %changed and 0b0110 == 0b0100) {
+    1
+  }
+  %composer.endReplaceableGroup()
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@Composable
+@NonRestartableComposable
+fun test2(x: KnownUnstable, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test2):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test2):Test.kt")
+  val tmp0_group = %composer.cache(%composer.changed(x)) {
+    1
+  }
+  %composer.endReplaceableGroup()
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
+@Composable
+@NonRestartableComposable
+fun test3(x: Uncertain, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test3):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test3):Test.kt")
+  val tmp0_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(x) || %changed and 0b0110 == 0b0100) {
+    1
+  }
+  %composer.endReplaceableGroup()
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testOptimizationFailsIfDefaultsGroupIsUsed\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testOptimizationFailsIfDefaultsGroupIsUsed\133useFir = false\135.txt"
new file mode 100644
index 0000000..1b486ea
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testOptimizationFailsIfDefaultsGroupIsUsed\133useFir = false\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = someInt()) {
+    val foo = remember { Foo() }
+    used(foo)
+    used(a)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = someInt()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    used(foo)
+    used(a)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testOptimizationFailsIfDefaultsGroupIsUsed\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testOptimizationFailsIfDefaultsGroupIsUsed\133useFir = true\135.txt"
new file mode 100644
index 0000000..1b486ea
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testOptimizationFailsIfDefaultsGroupIsUsed\133useFir = true\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = someInt()) {
+    val foo = remember { Foo() }
+    used(foo)
+    used(a)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = someInt()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    used(foo)
+    used(a)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInDirectFunction\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInDirectFunction\133useFir = false\135.txt"
new file mode 100644
index 0000000..6a68a2b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInDirectFunction\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int): Foo {
+    val b = someInt()
+    return remember(a, b) { Foo(a, b) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val b = someInt()
+  val tmp0 = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(Test):Test.kt")
+    val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(a) || %changed and 0b0110 == 0b0100 or %composer.changed(b)) {
+      Foo(a, b)
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInDirectFunction\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInDirectFunction\133useFir = true\135.txt"
new file mode 100644
index 0000000..6a68a2b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInDirectFunction\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int): Foo {
+    val b = someInt()
+    return remember(a, b) { Foo(a, b) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val b = someInt()
+  val tmp0 = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(Test):Test.kt")
+    val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(a) || %changed and 0b0110 == 0b0100 or %composer.changed(b)) {
+      Foo(a, b)
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInRestartableFunction\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInRestartableFunction\133useFir = false\135.txt"
new file mode 100644
index 0000000..0bf34d3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInRestartableFunction\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int) {
+    val b = someInt()
+    val foo = remember(a, b) { Foo(a, b) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val b = someInt()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %composer.changed(b)) {
+        Foo(a, b)
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInRestartableFunction\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInRestartableFunction\133useFir = true\135.txt"
new file mode 100644
index 0000000..0bf34d3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testParamAndNonParamInputsInRestartableFunction\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int) {
+    val b = someInt()
+    val foo = remember(a, b) { Foo(a, b) }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val b = someInt()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %composer.changed(b)) {
+        Foo(a, b)
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testPassedArgs\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testPassedArgs\133useFir = false\135.txt"
new file mode 100644
index 0000000..28739a4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testPassedArgs\133useFir = false\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun rememberFoo(a: Int, b: Int) = remember(a, b) { Foo(a, b) }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun rememberFoo(a: Int, b: Int, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(rememberFoo):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(rememberFoo):Test.kt")
+    val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(a) || %changed and 0b0110 == 0b0100 or %changed and 0b01110000 xor 0b00110000 > 32 && %composer.changed(b) || %changed and 0b00110000 == 0b00100000) {
+      Foo(a, b)
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testPassedArgs\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testPassedArgs\133useFir = true\135.txt"
new file mode 100644
index 0000000..28739a4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testPassedArgs\133useFir = true\135.txt"
@@ -0,0 +1,37 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun rememberFoo(a: Int, b: Int) = remember(a, b) { Foo(a, b) }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun rememberFoo(a: Int, b: Int, %composer: Composer?, %changed: Int): Foo {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(rememberFoo):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val tmp0 = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(rememberFoo):Test.kt")
+    val tmp1_group = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(a) || %changed and 0b0110 == 0b0100 or %changed and 0b01110000 xor 0b00110000 > 32 && %composer.changed(b) || %changed and 0b00110000 == 0b00100000) {
+      Foo(a, b)
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endReplaceableGroup()
+  return tmp0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAdaptedFunctionReference\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAdaptedFunctionReference\133useFir = false\135.txt"
new file mode 100644
index 0000000..8ef7180
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAdaptedFunctionReference\133useFir = false\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int) {
+    used(remember(a, ::effect))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
+        effect()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    })
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAdaptedFunctionReference\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAdaptedFunctionReference\133useFir = true\135.txt"
new file mode 100644
index 0000000..8ef7180
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAdaptedFunctionReference\133useFir = true\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int) {
+    used(remember(a, ::effect))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
+        effect()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    })
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..b63e3e7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = false\135.txt"
@@ -0,0 +1,79 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = 1, b: Foo = Foo.B, c: Int = swizzle(1, 2) ) {
+    val s = remember(a, b, c) { Any() }
+    used(s)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Foo?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%default and 0b0100 == 0 && %composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 1
+      }
+      if (%default and 0b0010 != 0) {
+        b = Foo.B
+      }
+      if (%default and 0b0100 != 0) {
+        c = swizzle(1, 2)
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0100 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val s = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<used(s...>:Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000) {
+        Any()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    used(s, %composer, 0b1000)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..b63e3e7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = true\135.txt"
@@ -0,0 +1,79 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = 1, b: Foo = Foo.B, c: Int = swizzle(1, 2) ) {
+    val s = remember(a, b, c) { Any() }
+    used(s)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Foo?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%default and 0b0100 == 0 && %composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 1
+      }
+      if (%default and 0b0010 != 0) {
+        b = Foo.B
+      }
+      if (%default and 0b0100 != 0) {
+        c = swizzle(1, 2)
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0100 != 0) {
+        %dirty = %dirty and 0b001110000000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val s = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<used(s...>:Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000) {
+        Any()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    used(s, %composer, 0b1000)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterStaticDefaultParameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterStaticDefaultParameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..39860a0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterStaticDefaultParameters\133useFir = false\135.txt"
@@ -0,0 +1,71 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = 1, b: Foo = Foo.B, c: Int = swizzle(1, 2) ) {
+    val s = remember(a, b, c) { Any() }
+    used(s)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Foo?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a = 1
+    }
+    if (%default and 0b0010 != 0) {
+      b = Foo.B
+    }
+    if (%default and 0b0100 != 0) {
+      c = swizzle(1, 2)
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val s = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<used(s...>:Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000) {
+        Any()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    used(s, %composer, 0b1000)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterStaticDefaultParameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterStaticDefaultParameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..39860a0
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterStaticDefaultParameters\133useFir = true\135.txt"
@@ -0,0 +1,71 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int = 1, b: Foo = Foo.B, c: Int = swizzle(1, 2) ) {
+    val s = remember(a, b, c) { Any() }
+    used(s)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Foo?, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%dirty and 0b001011011011 != 0b10010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      a = 1
+    }
+    if (%default and 0b0010 != 0) {
+      b = Foo.B
+    }
+    if (%default and 0b0100 != 0) {
+      c = swizzle(1, 2)
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val s = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<used(s...>:Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000) {
+        Any()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    used(s, %composer, 0b1000)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberFunctionReference\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberFunctionReference\133useFir = false\135.txt"
new file mode 100644
index 0000000..a4c5f1eb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberFunctionReference\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int) {
+    used(remember(a, ::effect))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100, effect)
+      %composer.endReplaceableGroup()
+      tmp0_group
+    })
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberFunctionReference\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberFunctionReference\133useFir = true\135.txt"
new file mode 100644
index 0000000..a4c5f1eb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberFunctionReference\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int) {
+    used(remember(a, ::effect))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100, effect)
+      %composer.endReplaceableGroup()
+      tmp0_group
+    })
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop\133useFir = false\135.txt"
new file mode 100644
index 0000000..fbcecde
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop\133useFir = false\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+val content: @Composable (a: SomeUnstableClass) -> Unit = {
+    for (index in 0 until count) {
+        val i = remember { index }
+    }
+    val a = remember { 1 }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val content: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<SomeUnstableClass, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: SomeUnstableClass, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    %composer.startReplaceableGroup(<>)
+    val <iterator> = 0 until count.iterator()
+    while (<iterator>.hasNext()) {
+      val index = <iterator>.next()
+      val i = <block>{
+        %composer.startReplaceableGroup(<>)
+        val tmp0_group = %composer.cache(false) {
+          index
+        }
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+    }
+    %composer.endReplaceableGroup()
+    val a = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmp1_group = %composer.cache(false) {
+        1
+      }
+      %composer.endReplaceableGroup()
+      tmp1_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop\133useFir = true\135.txt"
new file mode 100644
index 0000000..1403300
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop\133useFir = true\135.txt"
@@ -0,0 +1,51 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+val content: @Composable (a: SomeUnstableClass) -> Unit = {
+    for (index in 0 until count) {
+        val i = remember { index }
+    }
+    val a = remember { 1 }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val content: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: @[ParameterName(name = 'a')] SomeUnstableClass, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    %composer.startReplaceableGroup(<>)
+    val <iterator> = 0 until count.iterator()
+    while (<iterator>.hasNext()) {
+      val index = <iterator>.next()
+      val i = <block>{
+        %composer.startReplaceableGroup(<>)
+        val tmp0_group = %composer.cache(false) {
+          index
+        }
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+    }
+    %composer.endReplaceableGroup()
+    val a = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmp1_group = %composer.cache(false) {
+        1
+      }
+      %composer.endReplaceableGroup()
+      tmp1_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop_NoTrailingRemember\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop_NoTrailingRemember\133useFir = false\135.txt"
new file mode 100644
index 0000000..09202c9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop_NoTrailingRemember\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+val content: @Composable (a: SomeUnstableClass) -> Unit = {
+    for (index in 0 until count) {
+        val i = remember { index }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val content: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<SomeUnstableClass, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: SomeUnstableClass, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val <iterator> = 0 until count.iterator()
+    while (<iterator>.hasNext()) {
+      val index = <iterator>.next()
+      val i = <block>{
+        %composer.startReplaceableGroup(<>)
+        val tmp0_group = %composer.cache(false) {
+          index
+        }
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop_NoTrailingRemember\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop_NoTrailingRemember\133useFir = true\135.txt"
new file mode 100644
index 0000000..72b653b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInALoop_NoTrailingRemember\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+val content: @Composable (a: SomeUnstableClass) -> Unit = {
+    for (index in 0 until count) {
+        val i = remember { index }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+val content: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function3<@[ParameterName(name = 'a')] SomeUnstableClass, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: @[ParameterName(name = 'a')] SomeUnstableClass, %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val <iterator> = 0 until count.iterator()
+    while (<iterator>.hasNext()) {
+      val index = <iterator>.next()
+      val i = <block>{
+        %composer.startReplaceableGroup(<>)
+        val tmp0_group = %composer.cache(false) {
+          index
+        }
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIfWithComposableCallBefore\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIfWithComposableCallBefore\133useFir = false\135.txt"
new file mode 100644
index 0000000..0425815d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIfWithComposableCallBefore\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(condition: Boolean) {
+    if (condition) {
+        A()
+        val foo = remember { Foo() }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (condition) {
+      A(%composer, 0)
+      val foo = <block>{
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+        val tmp0_group = %composer.cache(false) {
+          Foo()
+        }
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIfWithComposableCallBefore\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIfWithComposableCallBefore\133useFir = true\135.txt"
new file mode 100644
index 0000000..0425815d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIfWithComposableCallBefore\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(condition: Boolean) {
+    if (condition) {
+        A()
+        val foo = remember { Foo() }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (condition) {
+      A(%composer, 0)
+      val foo = <block>{
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+        val tmp0_group = %composer.cache(false) {
+          Foo()
+        }
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIf\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIf\133useFir = false\135.txt"
new file mode 100644
index 0000000..0af000b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIf\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(condition: Boolean) {
+    A()
+    if (condition) {
+        val foo = remember { Foo() }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    if (condition) {
+      val foo = <block>{
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+        val tmp0_group = %composer.cache(false) {
+          Foo()
+        }
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIf\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIf\133useFir = true\135.txt"
new file mode 100644
index 0000000..0af000b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfIf\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(condition: Boolean) {
+    A()
+    if (condition) {
+        val foo = remember { Foo() }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    if (condition) {
+      val foo = <block>{
+        %composer.startReplaceableGroup(<>)
+        sourceInformation(%composer, "C(Test)<A()>:Test.kt")
+        val tmp0_group = %composer.cache(false) {
+          Foo()
+        }
+        %composer.endReplaceableGroup()
+        tmp0_group
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithCallsAfter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithCallsAfter\133useFir = false\135.txt"
new file mode 100644
index 0000000..77e7df1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithCallsAfter\133useFir = false\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(items: List<Int>) {
+    for (item in items) {
+        val foo = remember { Foo() }
+        A()
+        print(foo)
+        print(item)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    A(%composer, 0)
+    print(foo)
+    print(item)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithCallsAfter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithCallsAfter\133useFir = true\135.txt"
new file mode 100644
index 0000000..77e7df1
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithCallsAfter\133useFir = true\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(items: List<Int>) {
+    for (item in items) {
+        val foo = remember { Foo() }
+        A()
+        print(foo)
+        print(item)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    A(%composer, 0)
+    print(foo)
+    print(item)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithOnlyRemembers\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithOnlyRemembers\133useFir = false\135.txt"
new file mode 100644
index 0000000..1202a89
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithOnlyRemembers\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(items: List<Int>) {
+    for (item in items) {
+        val foo = remember { Foo() }
+        print(foo)
+        print(item)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    print(foo)
+    print(item)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithOnlyRemembers\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithOnlyRemembers\133useFir = true\135.txt"
new file mode 100644
index 0000000..1202a89
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberInsideOfWhileWithOnlyRemembers\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(items: List<Int>) {
+    for (item in items) {
+        val foo = remember { Foo() }
+        print(foo)
+        print(item)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val <iterator> = items.iterator()
+  while (<iterator>.hasNext()) {
+    val item = <iterator>.next()
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    print(foo)
+    print(item)
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberMemoizedLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberMemoizedLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..122ef5d2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberMemoizedLambda\133useFir = false\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int) {
+    used { a }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(a)) {
+        {
+          a
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    })
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberMemoizedLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberMemoizedLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..122ef5d2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberMemoizedLambda\133useFir = true\135.txt"
@@ -0,0 +1,49 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int) {
+    used { a }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(a)) {
+        {
+          a
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    })
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberPropertyReference\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberPropertyReference\133useFir = false\135.txt"
new file mode 100644
index 0000000..6a46f35
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberPropertyReference\133useFir = false\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: A) {
+    used(remember(a, a::value))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: A, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100, a::value)
+      %composer.endReplaceableGroup()
+      tmp0_group
+    })
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberPropertyReference\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberPropertyReference\133useFir = true\135.txt"
new file mode 100644
index 0000000..6a46f35
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberPropertyReference\133useFir = true\135.txt"
@@ -0,0 +1,46 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: A) {
+    used(remember(a, a::value))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: A, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(<block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100, a::value)
+      %composer.endReplaceableGroup()
+      tmp0_group
+    })
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithInlineClassInput\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithInlineClassInput\133useFir = false\135.txt"
new file mode 100644
index 0000000..89ee2a9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithInlineClassInput\133useFir = false\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(inlineInt: InlineInt) {
+    val a = InlineInt(123)
+    val foo = remember(inlineInt, a) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(inlineInt: InlineInt, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(0:InlineInt):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(inlineInt))) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val a = InlineInt(123)
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)P(0:InlineInt):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(inlineInt, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithInlineClassInput\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithInlineClassInput\133useFir = true\135.txt"
new file mode 100644
index 0000000..89ee2a9
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithInlineClassInput\133useFir = true\135.txt"
@@ -0,0 +1,50 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(inlineInt: InlineInt) {
+    val a = InlineInt(123)
+    val foo = remember(inlineInt, a) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(inlineInt: InlineInt, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(0:InlineInt):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(<unsafe-coerce>(inlineInt))) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val a = InlineInt(123)
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)P(0:InlineInt):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(inlineInt, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithNArgs\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithNArgs\133useFir = false\135.txt"
new file mode 100644
index 0000000..340650a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithNArgs\133useFir = false\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int, b: Int, c: Bar, d: Boolean) {
+    val foo = remember(a, b, c, d) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Int, c: Bar, d: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(d)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000 or %dirty and 0b0001110000000000 == 0b100000000000) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, d, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithNArgs\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithNArgs\133useFir = true\135.txt"
new file mode 100644
index 0000000..340650a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberWithNArgs\133useFir = true\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(a: Int, b: Int, c: Bar, d: Boolean) {
+    val foo = remember(a, b, c, d) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(a: Int, b: Int, c: Bar, d: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
+  }
+  if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
+  }
+  if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changed(d)) 0b100000000000 else 0b010000000000
+  }
+  if (%dirty and 0b0001011011011011 != 0b010010010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val foo = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test):Test.kt")
+      val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000 or %dirty and 0b0001110000000000 == 0b100000000000) {
+        Foo()
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(a, b, c, d, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRestartableParameterInputsStableUnstableUncertain\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRestartableParameterInputsStableUnstableUncertain\133useFir = false\135.txt"
new file mode 100644
index 0000000..b50bb53
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRestartableParameterInputsStableUnstableUncertain\133useFir = false\135.txt"
@@ -0,0 +1,104 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun test1(x: KnownStable) {
+    remember(x) { 1 }
+}
+@Composable
+fun test2(x: KnownUnstable) {
+    remember(x) { 1 }
+}
+@Composable
+fun test3(x: Uncertain) {
+    remember(x) { 1 }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun test1(x: KnownStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(test1):Test.kt")
+    val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
+      1
+    }
+    %composer.endReplaceableGroup()
+    tmp0_group
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test1(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun test2(x: KnownUnstable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test2):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test2):Test.kt")
+  val tmp0_group = %composer.cache(%composer.changed(x)) {
+    1
+  }
+  %composer.endReplaceableGroup()
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test2(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun test3(x: Uncertain, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(test3):Test.kt")
+    val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 || %dirty and 0b1000 != 0 && %composer.changed(x)) {
+      1
+    }
+    %composer.endReplaceableGroup()
+    tmp0_group
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test3(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRestartableParameterInputsStableUnstableUncertain\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRestartableParameterInputsStableUnstableUncertain\133useFir = true\135.txt"
new file mode 100644
index 0000000..b50bb53
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRestartableParameterInputsStableUnstableUncertain\133useFir = true\135.txt"
@@ -0,0 +1,104 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun test1(x: KnownStable) {
+    remember(x) { 1 }
+}
+@Composable
+fun test2(x: KnownUnstable) {
+    remember(x) { 1 }
+}
+@Composable
+fun test3(x: Uncertain) {
+    remember(x) { 1 }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun test1(x: KnownStable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test1):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(test1):Test.kt")
+    val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100) {
+      1
+    }
+    %composer.endReplaceableGroup()
+    tmp0_group
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test1(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun test2(x: KnownUnstable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test2):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "C(test2):Test.kt")
+  val tmp0_group = %composer.cache(%composer.changed(x)) {
+    1
+  }
+  %composer.endReplaceableGroup()
+  tmp0_group
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test2(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun test3(x: Uncertain, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(test3):Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(test3):Test.kt")
+    val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 || %dirty and 0b1000 != 0 && %composer.changed(x)) {
+      1
+    }
+    %composer.endReplaceableGroup()
+    tmp0_group
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    test3(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargWithSpread\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargWithSpread\133useFir = false\135.txt"
new file mode 100644
index 0000000..1b84b36
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargWithSpread\133useFir = false\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(items: Array<Bar>) {
+    val foo = remember(*items) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(items: Array<Bar>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val foo = remember(*items, {
+    Foo()
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargWithSpread\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargWithSpread\133useFir = true\135.txt"
new file mode 100644
index 0000000..1b84b36
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargWithSpread\133useFir = true\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(items: Array<Bar>) {
+    val foo = remember(*items) { Foo() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(items: Array<Bar>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val foo = remember(*items, {
+    Foo()
+  }, %composer, 0)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargsIntrinsicRemember\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargsIntrinsicRemember\133useFir = false\135.txt"
new file mode 100644
index 0000000..d1ffbe4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargsIntrinsicRemember\133useFir = false\135.txt"
@@ -0,0 +1,61 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(vararg strings: String) {
+    val show = remember { mutableStateOf(false) }
+    if (show.value) {
+        Text("Showing")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(strings: Array<out String>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, strings.size)
+  val <iterator> = strings.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val show = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        mutableStateOf(
+          value = false
+        )
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (show.value) {
+      Text("Showing", %composer, 0b0110)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(*strings, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargsIntrinsicRemember\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargsIntrinsicRemember\133useFir = true\135.txt"
new file mode 100644
index 0000000..d1ffbe4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testVarargsIntrinsicRemember\133useFir = true\135.txt"
@@ -0,0 +1,61 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(vararg strings: String) {
+    val show = remember { mutableStateOf(false) }
+    if (show.value) {
+        Text("Showing")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(strings: Array<out String>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, strings.size)
+  val <iterator> = strings.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val show = <block>{
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
+      val tmp0_group = %composer.cache(false) {
+        mutableStateOf(
+          value = false
+        )
+      }
+      %composer.endReplaceableGroup()
+      tmp0_group
+    }
+    if (show.value) {
+      Text("Showing", %composer, 0b0110)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(*strings, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testZeroArgRemember\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testZeroArgRemember\133useFir = false\135.txt"
new file mode 100644
index 0000000..657ec08
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testZeroArgRemember\133useFir = false\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(items: List<Int>) {
+    val foo = remember { Foo() }
+    used(items)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val foo = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(Test):Test.kt")
+    val tmp0_group = %composer.cache(false) {
+      Foo()
+    }
+    %composer.endReplaceableGroup()
+    tmp0_group
+  }
+  used(items)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testZeroArgRemember\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testZeroArgRemember\133useFir = true\135.txt"
new file mode 100644
index 0000000..657ec08
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testZeroArgRemember\133useFir = true\135.txt"
@@ -0,0 +1,42 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+
+
+@Composable
+fun Test(items: List<Int>) {
+    val foo = remember { Foo() }
+    used(items)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  val foo = <block>{
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "C(Test):Test.kt")
+    val tmp0_group = %composer.cache(false) {
+      Foo()
+    }
+    %composer.endReplaceableGroup()
+    tmp0_group
+  }
+  used(items)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(items, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testListOfMarkedAsStable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testListOfMarkedAsStable\133useFir = false\135.txt"
new file mode 100644
index 0000000..6bb2549
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testListOfMarkedAsStable\133useFir = false\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+@Composable
+fun Example() {
+    A(listOf("a"))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(list...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(listOf("a"), %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testListOfMarkedAsStable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testListOfMarkedAsStable\133useFir = true\135.txt"
new file mode 100644
index 0000000..6bb2549
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testListOfMarkedAsStable\133useFir = true\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+@Composable
+fun Example() {
+    A(listOf("a"))
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Example(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Example)<A(list...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A(listOf("a"), %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Example(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownStable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownStable\133useFir = false\135.txt"
new file mode 100644
index 0000000..55c7278
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownStable\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+import androidx.compose.runtime.remember
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+    A(Foo(0))
+    A(remember { Foo(0) })
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    A(Foo(0), %composer, 0)
+    A(remember({
+      Foo(0)
+    }, %composer, 0), %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownStable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownStable\133useFir = true\135.txt"
new file mode 100644
index 0000000..55c7278
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownStable\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+import androidx.compose.runtime.remember
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+    A(Foo(0))
+    A(remember { Foo(0) })
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    A(Foo(0), %composer, 0)
+    A(remember({
+      Foo(0)
+    }, %composer, 0), %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownUnstable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownUnstable\133useFir = false\135.txt"
new file mode 100644
index 0000000..129c1cd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownUnstable\133useFir = false\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+import androidx.compose.runtime.remember
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+    A(Foo(0))
+    A(remember { Foo(0) })
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(x, %composer, 0b1000)
+  A(Foo(0), %composer, 0b1000)
+  A(remember({
+    Foo(0)
+  }, %composer, 0), %composer, 0b1000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownUnstable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownUnstable\133useFir = true\135.txt"
new file mode 100644
index 0000000..129c1cd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StabilityPropagationTransformTests/testPassingLocalKnownUnstable\133useFir = true\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+
+import androidx.compose.runtime.remember
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+    A(Foo(0))
+    A(remember { Foo(0) })
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  A(x, %composer, 0b1000)
+  A(Foo(0), %composer, 0b1000)
+  A(remember({
+    Foo(0)
+  }, %composer, 0), %composer, 0b1000)
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..f9eb7dd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambda\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.DontMemoize
+
+@Composable
+fun Test() {
+    val foo = Foo(0)
+    val lambda = @DontMemoize { foo }
+    Lam @DontMemoize { foo }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = Foo(0)
+    val lambda = {
+      foo
+    }
+    Lam {
+      foo
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..f9eb7dd
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambda\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.DontMemoize
+
+@Composable
+fun Test() {
+    val foo = Foo(0)
+    val lambda = @DontMemoize { foo }
+    Lam @DontMemoize { foo }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = Foo(0)
+    val lambda = {
+      foo
+    }
+    Lam {
+      foo
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambdasInMarkedFunction\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambdasInMarkedFunction\133useFir = false\135.txt"
new file mode 100644
index 0000000..01d55915
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambdasInMarkedFunction\133useFir = false\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.DontMemoize
+
+@Composable
+@DontMemoize
+fun Test() {
+    val foo = Foo(0)
+    val lambda = { foo }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@DontMemoize
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = Foo(0)
+    val lambda = {
+      foo
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambdasInMarkedFunction\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambdasInMarkedFunction\133useFir = true\135.txt"
new file mode 100644
index 0000000..01d55915
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testDontMemoizeLambdasInMarkedFunction\133useFir = true\135.txt"
@@ -0,0 +1,45 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+import androidx.compose.runtime.DontMemoize
+
+@Composable
+@DontMemoize
+fun Test() {
+    val foo = Foo(0)
+    val lambda = { foo }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@DontMemoize
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = Foo(0)
+    val lambda = {
+      foo
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testFunctionInterfaceMemorized\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testFunctionInterfaceMemorized\133useFir = false\135.txt"
new file mode 100644
index 0000000..39d3d12
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testFunctionInterfaceMemorized\133useFir = false\135.txt"
@@ -0,0 +1,75 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            @Composable fun TestMemoizedFun(compute: TestFunInterface) {}
+@Composable fun Test() {
+    val capture = 0
+    TestMemoizedFun {
+        // no captures
+        use(it)
+    }
+    TestMemoizedFun {
+        // stable captures
+        use(capture)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun TestMemoizedFun(compute: TestFunInterface, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(TestMemoizedFun)")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    TestMemoizedFun(compute, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val capture = 0
+    TestMemoizedFun(TestFunInterface { it: Int ->
+      use(it)
+    }, %composer, 0b0110)
+    TestMemoizedFun(<block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(capture)) {
+        TestFunInterface { it: Int ->
+          use(capture)
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testFunctionInterfaceMemorized\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testFunctionInterfaceMemorized\133useFir = true\135.txt"
new file mode 100644
index 0000000..39d3d12
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testFunctionInterfaceMemorized\133useFir = true\135.txt"
@@ -0,0 +1,75 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            @Composable fun TestMemoizedFun(compute: TestFunInterface) {}
+@Composable fun Test() {
+    val capture = 0
+    TestMemoizedFun {
+        // no captures
+        use(it)
+    }
+    TestMemoizedFun {
+        // stable captures
+        use(capture)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun TestMemoizedFun(compute: TestFunInterface, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(TestMemoizedFun)")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    TestMemoizedFun(compute, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val capture = 0
+    TestMemoizedFun(TestFunInterface { it: Int ->
+      use(it)
+    }, %composer, 0b0110)
+    TestMemoizedFun(<block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changed(capture)) {
+        TestFunInterface { it: Int ->
+          use(capture)
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingComposableLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingComposableLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..a87358e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingComposableLambda\133useFir = false\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(foo: Foo, bar: Bar) {
+    val lambda: @Composable ()->Unit = {
+        foo
+        bar
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, bar: Bar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(1)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(foo)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b00110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(bar)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val lambda = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      if (%changed and 0b0011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        foo
+        bar
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, bar, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingComposableLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingComposableLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..a87358e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingComposableLambda\133useFir = true\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(foo: Foo, bar: Bar) {
+    val lambda: @Composable ()->Unit = {
+        foo
+        bar
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, bar: Bar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(1)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(foo)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b00110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(bar)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val lambda = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      if (%changed and 0b0011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        foo
+        bar
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, bar, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingStableAndUnstableCapturesInLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingStableAndUnstableCapturesInLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..1d34b4c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingStableAndUnstableCapturesInLambda\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test() {
+    val foo = Foo(0)
+    val bar = Bar(1)
+    val lambda = {
+        foo
+        bar
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = Foo(0)
+    val bar = Bar(1)
+    val lambda = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changedInstance(foo) or %composer.changed(bar)) {
+        {
+          foo
+          bar
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingStableAndUnstableCapturesInLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingStableAndUnstableCapturesInLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..1d34b4c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingStableAndUnstableCapturesInLambda\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test() {
+    val foo = Foo(0)
+    val bar = Bar(1)
+    val lambda = {
+        foo
+        bar
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = Foo(0)
+    val bar = Bar(1)
+    val lambda = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changedInstance(foo) or %composer.changed(bar)) {
+        {
+          foo
+          bar
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableCapturesInLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableCapturesInLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..43039fa
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableCapturesInLambda\133useFir = false\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test() {
+    val foo = Foo(0)
+    val lambda = { foo }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = Foo(0)
+    val lambda = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changedInstance(foo)) {
+        {
+          foo
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableCapturesInLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableCapturesInLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..43039fa
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableCapturesInLambda\133useFir = true\135.txt"
@@ -0,0 +1,48 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test() {
+    val foo = Foo(0)
+    val lambda = { foo }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    val foo = Foo(0)
+    val lambda = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changedInstance(foo)) {
+        {
+          foo
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableFunctionParameterInLambda\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableFunctionParameterInLambda\133useFir = false\135.txt"
new file mode 100644
index 0000000..ec359cb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableFunctionParameterInLambda\133useFir = false\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(foo: Foo, bar: Bar) {
+    val lambda: ()->Unit = { 
+        foo
+        bar
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, bar: Bar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(1)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(foo)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b00110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(bar)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val lambda = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changedInstance(foo) or %composer.changed(bar)) {
+        {
+          foo
+          bar
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, bar, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableFunctionParameterInLambda\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableFunctionParameterInLambda\133useFir = true\135.txt"
new file mode 100644
index 0000000..ec359cb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testMemoizingUnstableFunctionParameterInLambda\133useFir = true\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(foo: Foo, bar: Bar) {
+    val lambda: ()->Unit = { 
+        foo
+        bar
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(foo: Foo, bar: Bar, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)P(1)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(foo)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b00110000 == 0) {
+    %dirty = %dirty or if (%composer.changed(bar)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val lambda = <block>{
+      %composer.startReplaceableGroup(<>)
+      val tmpCache = %composer.cache(%composer.changedInstance(foo) or %composer.changed(bar)) {
+        {
+          foo
+          bar
+        }
+      }
+      %composer.endReplaceableGroup()
+      tmpCache
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(foo, bar, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..77819da
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableParam\133useFir = false\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+class Holder<T> {
+    @Composable
+    fun Test(x: T) {
+        A(x as Int)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Holder<T>  {
+  @Composable
+  fun Test(x: T, %composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(Test)")
+    val %dirty = %changed
+    if (%changed and 0b0110 == 0) {
+      %dirty = %dirty or if (if (%changed and 0b1000 == 0) {
+        %composer.changed(x)
+      } else {
+        %composer.changedInstance(x)
+      }
+      ) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(x, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..77819da
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableParam\133useFir = true\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+class Holder<T> {
+    @Composable
+    fun Test(x: T) {
+        A(x as Int)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Holder<T>  {
+  @Composable
+  fun Test(x: T, %composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(Test)")
+    val %dirty = %changed
+    if (%changed and 0b0110 == 0) {
+      %dirty = %dirty or if (if (%changed and 0b1000 == 0) {
+        %composer.changed(x)
+      } else {
+        %composer.changedInstance(x)
+      }
+      ) 0b0100 else 0b0010
+    }
+    if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(x, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableVarArgs\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableVarArgs\133useFir = false\135.txt"
new file mode 100644
index 0000000..0ac8764
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableVarArgs\133useFir = false\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+class Holder<T> {
+    @Composable
+    fun Test(vararg x: T) {
+        A(x as Int)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Holder<T>  {
+  @Composable
+  fun Test(x: Array<out T>, %composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(Test)")
+    val %dirty = %changed
+    %composer.startMovableGroup(<>, x.size)
+    val <iterator> = x.iterator()
+    while (<iterator>.hasNext()) {
+      val value = <iterator>.next()
+      %dirty = %dirty or if (if (%changed and 0b1000 == 0) {
+        %composer.changed(value)
+      } else {
+        %composer.changedInstance(value)
+      }
+      ) 0b0100 else 0
+    }
+    %composer.endMovableGroup()
+    if (%dirty and 0b1110 == 0) {
+      %dirty = %dirty or 0b0010
+    }
+    if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(x, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.Test(*x, %composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableVarArgs\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableVarArgs\133useFir = true\135.txt"
new file mode 100644
index 0000000..0ac8764
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testRuntimeStableVarArgs\133useFir = true\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+class Holder<T> {
+    @Composable
+    fun Test(vararg x: T) {
+        A(x as Int)
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Holder<T>  {
+  @Composable
+  fun Test(x: Array<out T>, %composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(Test)")
+    val %dirty = %changed
+    %composer.startMovableGroup(<>, x.size)
+    val <iterator> = x.iterator()
+    while (<iterator>.hasNext()) {
+      val value = <iterator>.next()
+      %dirty = %dirty or if (if (%changed and 0b1000 == 0) {
+        %composer.changed(value)
+      } else {
+        %composer.changedInstance(value)
+      }
+      ) 0b0100 else 0
+    }
+    %composer.endMovableGroup()
+    if (%dirty and 0b1110 == 0) {
+      %dirty = %dirty or 0b0010
+    }
+    if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %dirty, -1, <>)
+      }
+      A(x, %composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.Test(*x, %composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleNullableUnstableParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleNullableUnstableParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..1bd013b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleNullableUnstableParam\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo?) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleNullableUnstableParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleNullableUnstableParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..1bd013b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleNullableUnstableParam\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo?) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo?, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleOptionalUnstableParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleOptionalUnstableParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..91e94e2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleOptionalUnstableParam\133useFir = false\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo? = Foo()) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changedInstance(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        x = Foo()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleOptionalUnstableParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleOptionalUnstableParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..91e94e2
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleOptionalUnstableParam\133useFir = true\135.txt"
@@ -0,0 +1,54 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo? = Foo()) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%default and 0b0001 == 0 && %composer.changedInstance(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        x = Foo()
+        %dirty = %dirty and 0b1110.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0001 != 0) {
+        %dirty = %dirty and 0b1110.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleStableParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleStableParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..cf77d17
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleStableParam\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleStableParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleStableParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..cf77d17
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleStableParam\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleUnstableParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleUnstableParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..79205eb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleUnstableParam\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleUnstableParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleUnstableParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..79205eb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testSingleUnstableParam\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable
+fun Test(x: Foo) {
+    A(x)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(x: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(x)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(x, %composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(x, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStableUnstableParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStableUnstableParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..650d163
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStableUnstableParams\133useFir = false\135.txt"
@@ -0,0 +1,118 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun CanSkip(a: Int = 0, b: Foo = Foo()) {
+    used(a)
+    used(b)
+}
+@Composable fun CannotSkip(a: Int, b: Foo) {
+    used(a)
+    used(b)
+    print("Hello World")
+}
+@Composable fun NoParams() {
+    print("Hello World")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun CanSkip(a: Int, b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CanSkip)")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b00110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changedInstance(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 0
+      }
+      if (%default and 0b0010 != 0) {
+        b = Foo()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CanSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun CannotSkip(a: Int, b: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CannotSkip)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b00110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    print("Hello World")
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CannotSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun NoParams(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(NoParams)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    print("Hello World")
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    NoParams(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStableUnstableParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStableUnstableParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..650d163
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStableUnstableParams\133useFir = true\135.txt"
@@ -0,0 +1,118 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.NonRestartableComposable
+import androidx.compose.runtime.ReadOnlyComposable
+
+
+@Composable fun CanSkip(a: Int = 0, b: Foo = Foo()) {
+    used(a)
+    used(b)
+}
+@Composable fun CannotSkip(a: Int, b: Foo) {
+    used(a)
+    used(b)
+    print("Hello World")
+}
+@Composable fun NoParams() {
+    print("Hello World")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun CanSkip(a: Int, b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CanSkip)")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b00110000 == 0) {
+    %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changedInstance(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+    %composer.startDefaults()
+    if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+      if (%default and 0b0001 != 0) {
+        a = 0
+      }
+      if (%default and 0b0010 != 0) {
+        b = Foo()
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+      if (%default and 0b0010 != 0) {
+        %dirty = %dirty and 0b01110000.inv()
+      }
+    }
+    %composer.endDefaults()
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CanSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+fun CannotSkip(a: Int, b: Foo, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(CannotSkip)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
+  }
+  if (%changed and 0b00110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(b)) 0b00100000 else 0b00010000
+  }
+  if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    used(a)
+    used(b)
+    print("Hello World")
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    CannotSkip(a, b, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun NoParams(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(NoParams)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    print("Hello World")
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    NoParams(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStaticDefaultParam\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStaticDefaultParam\133useFir = false\135.txt"
new file mode 100644
index 0000000..cea0fa5
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStaticDefaultParam\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            @Composable
+fun Test(i: Int) {
+    A(i)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(i: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changed(i)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(i, null, null, %composer, 0b1110 and %dirty, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(i, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStaticDefaultParam\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStaticDefaultParam\133useFir = true\135.txt"
new file mode 100644
index 0000000..cea0fa5
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testStaticDefaultParam\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            @Composable
+fun Test(i: Int) {
+    A(i)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(i: Int, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  val %dirty = %changed
+  if (%changed and 0b0110 == 0) {
+    %dirty = %dirty or if (%composer.changed(i)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b0011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(i, null, null, %composer, 0b1110 and %dirty, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(i, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testVarArgs\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testVarArgs\133useFir = false\135.txt"
new file mode 100644
index 0000000..11217bf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testVarArgs\133useFir = false\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            @Composable fun Varargs(vararg ints: Int) {
+}
+@Composable fun Test() {
+    Varargs(1, 2, 3)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Varargs(ints: IntArray, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Varargs)")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, ints.size)
+  val <iterator> = ints.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Varargs(*ints, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Varargs(1, 2, 3, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testVarArgs\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testVarArgs\133useFir = true\135.txt"
new file mode 100644
index 0000000..11217bf
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.StrongSkippingModeTransformTests/testVarArgs\133useFir = true\135.txt"
@@ -0,0 +1,66 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            @Composable fun Varargs(vararg ints: Int) {
+}
+@Composable fun Test() {
+    Varargs(1, 2, 3)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Varargs(ints: IntArray, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Varargs)")
+  val %dirty = %changed
+  %composer.startMovableGroup(<>, ints.size)
+  val <iterator> = ints.iterator()
+  while (<iterator>.hasNext()) {
+    val value = <iterator>.next()
+    %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0
+  }
+  %composer.endMovableGroup()
+  if (%dirty and 0b1110 == 0) {
+    %dirty = %dirty or 0b0010
+  }
+  if (%dirty and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Varargs(*ints, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Varargs(1, 2, 3, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testAddingComposablesToAList\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testAddingComposablesToAList\133useFir = false\135.txt"
new file mode 100644
index 0000000..8cb05c7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testAddingComposablesToAList\133useFir = false\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+class Scope {
+    private val list = IntervalList<Scope.(Int) -> (@Composable () -> Unit)>()
+    fun item(content: @Composable Scope.() -> Unit) {
+        list.add(1) { @Composable { content() } }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Scope {
+  val list: IntervalList<@[ExtensionFunctionType] Function2<Scope, Int, Function2<Composer, Int, Unit>>> = IntervalList()
+  fun item(content: @[ExtensionFunctionType] Function3<Scope, Composer, Int, Unit>) {
+    list.add(1) { it: Int ->
+      composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<conten...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          content(%this%add, %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testAddingComposablesToAList\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testAddingComposablesToAList\133useFir = true\135.txt"
new file mode 100644
index 0000000..8cb05c7
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testAddingComposablesToAList\133useFir = true\135.txt"
@@ -0,0 +1,40 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+class Scope {
+    private val list = IntervalList<Scope.(Int) -> (@Composable () -> Unit)>()
+    fun item(content: @Composable Scope.() -> Unit) {
+        list.add(1) { @Composable { content() } }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class Scope {
+  val list: IntervalList<@[ExtensionFunctionType] Function2<Scope, Int, Function2<Composer, Int, Unit>>> = IntervalList()
+  fun item(content: @[ExtensionFunctionType] Function3<Scope, Composer, Int, Unit>) {
+    list.add(1) { it: Int ->
+      composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+        sourceInformation(%composer, "C<conten...>:Test.kt")
+        if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+          if (isTraceInProgress()) {
+            traceEventStart(<>, %changed, -1, <>)
+          }
+          content(%this%add, %composer, 0)
+          if (isTraceInProgress()) {
+            traceEventEnd()
+          }
+        } else {
+          %composer.skipToGroupEnd()
+        }
+      }
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingComposableParameterWithComposableParameter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingComposableParameterWithComposableParameter\133useFir = false\135.txt"
new file mode 100644
index 0000000..2bf471c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingComposableParameterWithComposableParameter\133useFir = false\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(decorator: @Composable (content: @Composable () -> Unit) -> Unit) {
+    decorator {
+      Text("Some text")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[UI[UI[UI]]]")
+fun Test(decorator: Function3<@[ParameterName(name = 'content')] Function2<Composer, Int, Unit>, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<decora...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(decorator)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    decorator(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110 or 0b01110000 and %dirty shl 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(decorator, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Text("...>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Text("Some text", %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingComposableParameterWithComposableParameter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingComposableParameterWithComposableParameter\133useFir = true\135.txt"
new file mode 100644
index 0000000..2bf471c
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingComposableParameterWithComposableParameter\133useFir = true\135.txt"
@@ -0,0 +1,57 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(decorator: @Composable (content: @Composable () -> Unit) -> Unit) {
+    decorator {
+      Text("Some text")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[UI[UI[UI]]]")
+fun Test(decorator: Function3<@[ParameterName(name = 'content')] Function2<Composer, Int, Unit>, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<decora...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(decorator)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    decorator(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110 or 0b01110000 and %dirty shl 0b0011)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(decorator, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Text("...>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Text("Some text", %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingLayout\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingLayout\133useFir = false\135.txt"
new file mode 100644
index 0000000..ba5d12b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingLayout\133useFir = false\135.txt"
@@ -0,0 +1,246 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+import androidx.compose.ui.layout.*
+import androidx.compose.foundation.text.*
+import androidx.compose.ui.text.*
+import androidx.compose.ui.text.style.*
+
+@Composable
+fun Test1() {
+    Layout(content = { }) { _, _ -> error("") }
+}
+
+@Composable
+fun Test2(content: @Composable ()->Unit) {
+    Layout(content = content) { _, _ -> error("") }
+}
+
+@Composable
+fun Test3() {
+  Test1()
+}
+
+@Composable
+fun Test4() {
+  BasicText(text = AnnotatedString("Some text"))
+}
+
+val Local = compositionLocalOf { 0 }
+
+@Composable
+fun Test5(content: @Composable () -> Unit) {
+  CompositionLocalProvider(Local provides 5) {
+      Test1()
+      content()
+  }
+}
+
+@Composable
+fun Test6(test: String) {
+  CompositionLocalProvider(Local provides 6) {
+     T(test)
+     Test1()
+  }
+}
+
+@Composable
+fun T(value: String) { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test1(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test1)<Layout...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Layout({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+      Unit
+      sourceInformationMarkerEnd(%composer)
+    }, null, MeasurePolicy { <unused var>: List<Measurable>, <unused var>: Constraints ->
+      error("")
+    }, %composer, 0b000110000000, 0b0010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test1(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
+fun Test2(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test2)<Layout...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Layout(content, null, MeasurePolicy { <unused var>: List<Measurable>, <unused var>: Constraints ->
+      error("")
+    }, %composer, 0b000110000000 or 0b1110 and %dirty, 0b0010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test2(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test3(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test3)<Test1(...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Test1(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test3(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test4(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test4)<BasicT...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    BasicText(AnnotatedString(
+      text = "Some text"
+    ), null, null, null, <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0b0110, 0b001111111110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test4(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+val Local: ProvidableCompositionLocal<Int> = compositionLocalOf {
+  0
+}
+@Composable
+@ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
+fun Test5(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test5)<Compos...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    CompositionLocalProvider(Local provides 5, composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Test1(...>,<conten...>:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        Test1(%composer, 0)
+        content(%composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b00110000 or ProvidedValue.%stable or 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test5(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test6(test: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test6)<Compos...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(test)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    CompositionLocalProvider(Local provides 6, composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<T(test...>,<Test1(...>:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        T(test, %composer, 0)
+        Test1(%composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b00110000 or ProvidedValue.%stable or 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test6(test, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun T(value: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(T):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    T(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingLayout\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingLayout\133useFir = true\135.txt"
new file mode 100644
index 0000000..ba5d12b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingLayout\133useFir = true\135.txt"
@@ -0,0 +1,246 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+import androidx.compose.ui.layout.*
+import androidx.compose.foundation.text.*
+import androidx.compose.ui.text.*
+import androidx.compose.ui.text.style.*
+
+@Composable
+fun Test1() {
+    Layout(content = { }) { _, _ -> error("") }
+}
+
+@Composable
+fun Test2(content: @Composable ()->Unit) {
+    Layout(content = content) { _, _ -> error("") }
+}
+
+@Composable
+fun Test3() {
+  Test1()
+}
+
+@Composable
+fun Test4() {
+  BasicText(text = AnnotatedString("Some text"))
+}
+
+val Local = compositionLocalOf { 0 }
+
+@Composable
+fun Test5(content: @Composable () -> Unit) {
+  CompositionLocalProvider(Local provides 5) {
+      Test1()
+      content()
+  }
+}
+
+@Composable
+fun Test6(test: String) {
+  CompositionLocalProvider(Local provides 6) {
+     T(test)
+     Test1()
+  }
+}
+
+@Composable
+fun T(value: String) { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test1(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test1)<Layout...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Layout({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+      Unit
+      sourceInformationMarkerEnd(%composer)
+    }, null, MeasurePolicy { <unused var>: List<Measurable>, <unused var>: Constraints ->
+      error("")
+    }, %composer, 0b000110000000, 0b0010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test1(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
+fun Test2(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test2)<Layout...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Layout(content, null, MeasurePolicy { <unused var>: List<Measurable>, <unused var>: Constraints ->
+      error("")
+    }, %composer, 0b000110000000 or 0b1110 and %dirty, 0b0010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test2(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test3(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test3)<Test1(...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Test1(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test3(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test4(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test4)<BasicT...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    BasicText(AnnotatedString(
+      text = "Some text"
+    ), null, null, null, <unsafe-coerce>(0), false, 0, 0, null, null, %composer, 0b0110, 0b001111111110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test4(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+val Local: ProvidableCompositionLocal<Int> = compositionLocalOf {
+  0
+}
+@Composable
+@ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
+fun Test5(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test5)<Compos...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    CompositionLocalProvider(Local provides 5, composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<Test1(...>,<conten...>:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        Test1(%composer, 0)
+        content(%composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b00110000 or ProvidedValue.%stable or 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test5(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "androidx.compose.ui.UiComposable")
+fun Test6(test: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test6)<Compos...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(test)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    CompositionLocalProvider(Local provides 6, composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C<T(test...>,<Test1(...>:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        T(test, %composer, 0)
+        Test1(%composer, 0)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }, %composer, 0b00110000 or ProvidedValue.%stable or 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test6(test, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun T(value: String, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(T):Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    T(value, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingNullableComposableWithNull\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingNullableComposableWithNull\133useFir = false\135.txt"
new file mode 100644
index 0000000..cb02395
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingNullableComposableWithNull\133useFir = false\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test() {
+    Widget(null)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Widget...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Widget(null, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingNullableComposableWithNull\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingNullableComposableWithNull\133useFir = true\135.txt"
new file mode 100644
index 0000000..cb02395
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCallingNullableComposableWithNull\133useFir = true\135.txt"
@@ -0,0 +1,34 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test() {
+    Widget(null)
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Widget...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Widget(null, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCanInferWithGeneric\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCanInferWithGeneric\133useFir = false\135.txt"
new file mode 100644
index 0000000..f6fd18e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCanInferWithGeneric\133useFir = false\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+  Wrapper {
+    Text("test")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "UI")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Wrappe...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Wrapper(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Text("...>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Text("test", %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCanInferWithGeneric\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCanInferWithGeneric\133useFir = true\135.txt"
new file mode 100644
index 0000000..f6fd18e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCanInferWithGeneric\133useFir = true\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+  Wrapper {
+    Text("test")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "UI")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Wrappe...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Wrapper(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Text("...>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Text("test", %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCompositionLocalsProvider\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCompositionLocalsProvider\133useFir = false\135.txt"
new file mode 100644
index 0000000..7da5ff3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCompositionLocalsProvider\133useFir = false\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+
+@Composable
+fun Test() {
+  CompositionLocalProvider {
+    Text("test")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "UI")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Compos...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    CompositionLocalProvider(
+      content = ComposableSingletons%TestKt.lambda-1,
+      %composer = %composer,
+      %changed = 56
+    )
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Text("...>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Text("test", %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCompositionLocalsProvider\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCompositionLocalsProvider\133useFir = true\135.txt"
new file mode 100644
index 0000000..7da5ff3
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCompositionLocalsProvider\133useFir = true\135.txt"
@@ -0,0 +1,58 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+
+@Composable
+fun Test() {
+  CompositionLocalProvider {
+    Text("test")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "UI")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Compos...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    CompositionLocalProvider(
+      content = ComposableSingletons%TestKt.lambda-1,
+      %composer = %composer,
+      %changed = 56
+    )
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Text("...>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Text("test", %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCrossfileFileScope\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCrossfileFileScope\133useFir = false\135.txt"
new file mode 100644
index 0000000..9fb4333
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCrossfileFileScope\133useFir = false\135.txt"
@@ -0,0 +1,33 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun InferN() { N() }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "NComposable")
+fun InferN(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(InferN)<N()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    N(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    InferN(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCrossfileFileScope\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCrossfileFileScope\133useFir = true\135.txt"
new file mode 100644
index 0000000..9fb4333
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testCrossfileFileScope\133useFir = true\135.txt"
@@ -0,0 +1,33 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun InferN() { N() }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "NComposable")
+fun InferN(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(InferN)<N()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    N(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    InferN(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testFileScoped\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testFileScoped\133useFir = false\135.txt"
new file mode 100644
index 0000000..2fb24818
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testFileScoped\133useFir = false\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+@file:NComposable
+
+import androidx.compose.runtime.*
+
+@Composable
+fun NFromFile() {
+    Open()
+}
+
+@Composable
+fun NFromInference() {
+    N()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun NFromFile(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(NFromFile)<Open()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Open(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    NFromFile(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun NFromInference(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(NFromInference)<N()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    N(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    NFromInference(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testFileScoped\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testFileScoped\133useFir = true\135.txt"
new file mode 100644
index 0000000..2fb24818
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testFileScoped\133useFir = true\135.txt"
@@ -0,0 +1,60 @@
+//
+// Source
+// ------------------------------------------
+
+@file:NComposable
+
+import androidx.compose.runtime.*
+
+@Composable
+fun NFromFile() {
+    Open()
+}
+
+@Composable
+fun NFromInference() {
+    N()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun NFromFile(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(NFromFile)<Open()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Open(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    NFromFile(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+fun NFromInference(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(NFromInference)<N()>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    N(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    NFromInference(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferInlineLambdaParameter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferInlineLambdaParameter\133useFir = false\135.txt"
new file mode 100644
index 0000000..a3ceb41
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferInlineLambdaParameter\133useFir = false\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(content: @Composable () -> Unit) {
+  InlineRow {
+    Text("test")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[UI[_]]")
+fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Inline...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    InlineRow({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
+      Text("test", %composer, 0b0110)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferInlineLambdaParameter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferInlineLambdaParameter\133useFir = true\135.txt"
new file mode 100644
index 0000000..a3ceb41
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferInlineLambdaParameter\133useFir = true\135.txt"
@@ -0,0 +1,41 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(content: @Composable () -> Unit) {
+  InlineRow {
+    Text("test")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[UI[_]]")
+fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Inline...>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    InlineRow({ %composer: Composer?, %changed: Int ->
+      sourceInformationMarkerStart(%composer, <>, "C<Text("...>:Test.kt")
+      Text("test", %composer, 0b0110)
+      sourceInformationMarkerEnd(%composer)
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferLambdaParameter\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferLambdaParameter\133useFir = false\135.txt"
new file mode 100644
index 0000000..944f0fb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferLambdaParameter\133useFir = false\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(content: @Composable () -> Unit) {
+  Row {
+    Text("test")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[UI[_]]")
+fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Row>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Row(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Text("...>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Text("test", %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferLambdaParameter\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferLambdaParameter\133useFir = true\135.txt"
new file mode 100644
index 0000000..944f0fb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferLambdaParameter\133useFir = true\135.txt"
@@ -0,0 +1,53 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(content: @Composable () -> Unit) {
+  Row {
+    Text("test")
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[UI[_]]")
+fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Row>:Test.kt")
+  if (%changed and 0b0001 != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Row(ComposableSingletons%TestKt.lambda-1, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Text("...>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Text("test", %composer, 0b0110)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferSimpleOpen\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferSimpleOpen\133useFir = false\135.txt"
new file mode 100644
index 0000000..33cc305
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferSimpleOpen\133useFir = false\135.txt"
@@ -0,0 +1,31 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferSimpleOpen\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferSimpleOpen\133useFir = true\135.txt"
new file mode 100644
index 0000000..33cc305
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferSimpleOpen\133useFir = true\135.txt"
@@ -0,0 +1,31 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() { }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUIFromCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUIFromCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..bcd752a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUIFromCall\133useFir = false\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+    Text("Hello")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "UI")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Text("Hello", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUIFromCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUIFromCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..bcd752a
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUIFromCall\133useFir = true\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+    Text("Hello")
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "UI")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Text("...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Text("Hello", %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUnifiedParameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUnifiedParameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..f848dfe
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUnifiedParameters\133useFir = false\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(content: @Composable () -> Unit) {
+  content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUnifiedParameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUnifiedParameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..f848dfe
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferUnifiedParameters\133useFir = true\135.txt"
@@ -0,0 +1,39 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test(content: @Composable () -> Unit) {
+  content()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferVectorFromCall\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferVectorFromCall\133useFir = false\135.txt"
new file mode 100644
index 0000000..7d21a2d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferVectorFromCall\133useFir = false\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+    Circle()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "Vector")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Circle...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Circle(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferVectorFromCall\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferVectorFromCall\133useFir = true\135.txt"
new file mode 100644
index 0000000..7d21a2d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferVectorFromCall\133useFir = true\135.txt"
@@ -0,0 +1,35 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+@Composable
+fun Test() {
+    Circle()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "Vector")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<Circle...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Circle(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringFunInterfaceParameterAnnotations\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringFunInterfaceParameterAnnotations\133useFir = false\135.txt"
new file mode 100644
index 0000000..b55867d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringFunInterfaceParameterAnnotations\133useFir = false\135.txt"
@@ -0,0 +1,160 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+fun interface CustomComposable {
+    @Composable
+    fun call()
+}
+
+@Composable
+fun OpenCustom(content: CustomComposable) {
+    content.call()
+}
+
+@Composable
+fun ClosedCustom(content: CustomComposable) {
+    Text("Test")
+    content.call()
+}
+
+@Composable
+fun Test() {
+    OpenCustom {
+        Text("Test")
+    }
+    ClosedCustom  {
+        Text("Test")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface CustomComposable {
+  @Composable
+  abstract fun call(%composer: Composer?, %changed: Int)
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun OpenCustom(content: CustomComposable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(OpenCustom)<call()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content.call(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    OpenCustom(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[UI[UI]]")
+fun ClosedCustom(content: CustomComposable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(ClosedCustom)<Text("...>,<call()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Test", %composer, 0b0110)
+    content.call(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    ClosedCustom(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "UI")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<OpenCu...>,<Closed...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    OpenCustom(<block>{
+      class <no name provided> : CustomComposable {
+        @Composable
+        @ComposableTarget(applier = "UI")
+        override fun call(%composer: Composer?, %changed: Int) {
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(call)<Text("...>:Test.kt")
+          if (%changed and 0b0001 != 0 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %changed, -1, <>)
+            }
+            Text("Test", %composer, 0b0110)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+          val tmp0_rcvr = <this>
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            tmp0_rcvr.call(%composer, updateChangedFlags(%changed or 0b0001))
+          }
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    ClosedCustom(<block>{
+      class <no name provided> : CustomComposable {
+        @Composable
+        @ComposableTarget(applier = "UI")
+        override fun call(%composer: Composer?, %changed: Int) {
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(call)<Text("...>:Test.kt")
+          if (%changed and 0b0001 != 0 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %changed, -1, <>)
+            }
+            Text("Test", %composer, 0b0110)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+          val tmp0_rcvr = <this>
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            tmp0_rcvr.call(%composer, updateChangedFlags(%changed or 0b0001))
+          }
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringFunInterfaceParameterAnnotations\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringFunInterfaceParameterAnnotations\133useFir = true\135.txt"
new file mode 100644
index 0000000..b55867d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringFunInterfaceParameterAnnotations\133useFir = true\135.txt"
@@ -0,0 +1,160 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+fun interface CustomComposable {
+    @Composable
+    fun call()
+}
+
+@Composable
+fun OpenCustom(content: CustomComposable) {
+    content.call()
+}
+
+@Composable
+fun ClosedCustom(content: CustomComposable) {
+    Text("Test")
+    content.call()
+}
+
+@Composable
+fun Test() {
+    OpenCustom {
+        Text("Test")
+    }
+    ClosedCustom  {
+        Text("Test")
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+interface CustomComposable {
+  @Composable
+  abstract fun call(%composer: Composer?, %changed: Int)
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun OpenCustom(content: CustomComposable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(OpenCustom)<call()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content.call(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    OpenCustom(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[UI[UI]]")
+fun ClosedCustom(content: CustomComposable, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(ClosedCustom)<Text("...>,<call()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    Text("Test", %composer, 0b0110)
+    content.call(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    ClosedCustom(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableTarget(applier = "UI")
+fun Test(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<OpenCu...>,<Closed...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    OpenCustom(<block>{
+      class <no name provided> : CustomComposable {
+        @Composable
+        @ComposableTarget(applier = "UI")
+        override fun call(%composer: Composer?, %changed: Int) {
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(call)<Text("...>:Test.kt")
+          if (%changed and 0b0001 != 0 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %changed, -1, <>)
+            }
+            Text("Test", %composer, 0b0110)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+          val tmp0_rcvr = <this>
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            tmp0_rcvr.call(%composer, updateChangedFlags(%changed or 0b0001))
+          }
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    ClosedCustom(<block>{
+      class <no name provided> : CustomComposable {
+        @Composable
+        @ComposableTarget(applier = "UI")
+        override fun call(%composer: Composer?, %changed: Int) {
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(call)<Text("...>:Test.kt")
+          if (%changed and 0b0001 != 0 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %changed, -1, <>)
+            }
+            Text("Test", %composer, 0b0110)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+          val tmp0_rcvr = <this>
+          %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+            tmp0_rcvr.call(%composer, updateChangedFlags(%changed or 0b0001))
+          }
+        }
+      }
+      <no name provided>()
+    }, %composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringTargetFromAncestorMethod\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringTargetFromAncestorMethod\133useFir = false\135.txt"
new file mode 100644
index 0000000..117b34b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringTargetFromAncestorMethod\133useFir = false\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ComposableTarget
+import androidx.compose.runtime.ComposableOpenTarget
+
+@Composable @ComposableOpenTarget(0) fun OpenTarget() { }
+
+abstract class Base {
+  @Composable @ComposableTarget("N") abstract fun Compose()
+}
+
+class Valid : Base () {
+  @Composable override fun Compose() {
+    OpenTarget()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableOpenTarget(index = 0)
+fun OpenTarget(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(OpenTarget):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    OpenTarget(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@StabilityInferred(parameters = 0)
+abstract class Base {
+  @Composable
+  @ComposableTarget(applier = "N")
+  abstract fun Compose(%composer: Composer?, %changed: Int)
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class Valid : Base {
+  @Composable
+  override fun Compose(%composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(Compose)<OpenTa...>:Test.kt")
+    if (%changed and 0b0001 != 0 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      OpenTarget(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.Compose(%composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringTargetFromAncestorMethod\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringTargetFromAncestorMethod\133useFir = true\135.txt"
new file mode 100644
index 0000000..117b34b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testInferringTargetFromAncestorMethod\133useFir = true\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ComposableTarget
+import androidx.compose.runtime.ComposableOpenTarget
+
+@Composable @ComposableOpenTarget(0) fun OpenTarget() { }
+
+abstract class Base {
+  @Composable @ComposableTarget("N") abstract fun Compose()
+}
+
+class Valid : Base () {
+  @Composable override fun Compose() {
+    OpenTarget()
+  }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableOpenTarget(index = 0)
+fun OpenTarget(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(OpenTarget):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    OpenTarget(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@StabilityInferred(parameters = 0)
+abstract class Base {
+  @Composable
+  @ComposableTarget(applier = "N")
+  abstract fun Compose(%composer: Composer?, %changed: Int)
+  static val %stable: Int = 0
+}
+@StabilityInferred(parameters = 0)
+class Valid : Base {
+  @Composable
+  override fun Compose(%composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(Compose)<OpenTa...>:Test.kt")
+    if (%changed and 0b0001 != 0 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      OpenTarget(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.Compose(%composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 0
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testLetIt\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testLetIt\133useFir = false\135.txt"
new file mode 100644
index 0000000..704fe0d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testLetIt\133useFir = false\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(content: (@Composable () -> Unit?)) {
+    content?.let { it() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Test(content: Function2<Composer, Int, Unit?>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<it()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val tmp0_safe_receiver = content
+    val tmp1_group = when {
+      tmp0_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        val tmp0_group = tmp0_safe_receiver.let { it: Function2<Composer, Int, Unit?> ->
+          val tmp0_return = it(%composer, 0)
+          tmp0_return
+        }
+        tmp0_group
+      }
+    }
+    tmp1_group
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testLetIt\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testLetIt\133useFir = true\135.txt"
new file mode 100644
index 0000000..704fe0d
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testLetIt\133useFir = true\135.txt"
@@ -0,0 +1,52 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(content: (@Composable () -> Unit?)) {
+    content?.let { it() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Test(content: Function2<Composer, Int, Unit?>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)*<it()>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val tmp0_safe_receiver = content
+    val tmp1_group = when {
+      tmp0_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        val tmp0_group = tmp0_safe_receiver.let { it: Function2<Composer, Int, Unit?> ->
+          val tmp0_return = it(%composer, 0)
+          tmp0_return
+        }
+        tmp0_group
+      }
+    }
+    tmp1_group
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testOptionalParameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testOptionalParameters\133useFir = false\135.txt"
new file mode 100644
index 0000000..e58ce9e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testOptionalParameters\133useFir = false\135.txt"
@@ -0,0 +1,275 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@ComposableTarget("UI")
+fun Leaf() { }
+
+@Composable
+fun Wrapper(content: @Composable () -> Unit) { content() }
+
+// [0,[0],[0],[0],[0],[0],[0],[0]]
+@Composable
+fun Optional(
+    one: @Composable () -> Unit = { },
+    two: (@Composable () -> Unit)? = null,
+    three: (@Composable () -> Unit)? = null,
+    four: (@Composable () -> Unit)? = null,
+    five: (@Composable () -> Unit)? = null,
+    six: (@Composable () -> Unit)? = null,
+    content: @Composable () -> Unit
+) {
+    one()
+
+    // Invoke through a ?.
+    two?.invoke()
+
+    // Invoke through a let
+    three?.let { it() }
+
+    // Invoke through a let test
+    four?.let { four() }
+
+    // Invoke through in an then block
+    if (five != null)
+        five()
+
+    six?.let { it -> Wrapper(it) }
+
+    content()
+}
+
+@Composable
+fun UseOptional() {
+    Optional {
+        Leaf()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "UI")
+fun Leaf(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Leaf):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Leaf(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Wrapper(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Wrapper)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Wrapper(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0][0][0][0][0][0][0]]")
+fun Optional(one: Function2<Composer, Int, Unit>?, two: Function2<Composer, Int, Unit>?, three: Function2<Composer, Int, Unit>?, four: Function2<Composer, Int, Unit>?, five: Function2<Composer, Int, Unit>?, six: Function2<Composer, Int, Unit>?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Optional)P(3,6,5,2,1,4)<one()>,<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(one)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(two)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(three)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(four)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(five)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(six)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%dirty and 0b001011011011011011011011 != 0b10010010010010010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      one = ComposableSingletons%TestKt.lambda-1
+    }
+    if (%default and 0b0010 != 0) {
+      two = null
+    }
+    if (%default and 0b0100 != 0) {
+      three = null
+    }
+    if (%default and 0b1000 != 0) {
+      four = null
+    }
+    if (%default and 0b00010000 != 0) {
+      five = null
+    }
+    if (%default and 0b00100000 != 0) {
+      six = null
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    one(%composer, 0b1110 and %dirty)
+    two?.invoke(%composer, 0b1110 and %dirty shr 0b0011)
+    val tmp1_safe_receiver = three
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<it()>")
+    val tmp1_group = when {
+      tmp1_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp1_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
+          it(%composer, 0)
+        }
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+    val tmp2_safe_receiver = four
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<four()>")
+    val tmp2_group = when {
+      tmp2_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp2_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
+          four(%composer, 0b1110 and %dirty shr 0b1001)
+        }
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmp2_group
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<five()>")
+    if (five != null) {
+      five(%composer, 0b1110 and %dirty shr 0b1100)
+    }
+    %composer.endReplaceableGroup()
+    val tmp3_safe_receiver = six
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<Wrappe...>")
+    val tmp3_group = when {
+      tmp3_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp3_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
+          Wrapper(it, %composer, 0)
+        }
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmp3_group
+    content(%composer, 0b1110 and %dirty shr 0b00010010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Optional(one, two, three, four, five, six, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+@ComposableTarget(applier = "UI")
+fun UseOptional(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(UseOptional)<Option...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Optional(null, null, null, null, null, null, ComposableSingletons%TestKt.lambda-2, %composer, 0b000110000000000000000000, 0b00111111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    UseOptional(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Leaf()>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Leaf(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testOptionalParameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testOptionalParameters\133useFir = true\135.txt"
new file mode 100644
index 0000000..e58ce9e
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testOptionalParameters\133useFir = true\135.txt"
@@ -0,0 +1,275 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@ComposableTarget("UI")
+fun Leaf() { }
+
+@Composable
+fun Wrapper(content: @Composable () -> Unit) { content() }
+
+// [0,[0],[0],[0],[0],[0],[0],[0]]
+@Composable
+fun Optional(
+    one: @Composable () -> Unit = { },
+    two: (@Composable () -> Unit)? = null,
+    three: (@Composable () -> Unit)? = null,
+    four: (@Composable () -> Unit)? = null,
+    five: (@Composable () -> Unit)? = null,
+    six: (@Composable () -> Unit)? = null,
+    content: @Composable () -> Unit
+) {
+    one()
+
+    // Invoke through a ?.
+    two?.invoke()
+
+    // Invoke through a let
+    three?.let { it() }
+
+    // Invoke through a let test
+    four?.let { four() }
+
+    // Invoke through in an then block
+    if (five != null)
+        five()
+
+    six?.let { it -> Wrapper(it) }
+
+    content()
+}
+
+@Composable
+fun UseOptional() {
+    Optional {
+        Leaf()
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableTarget(applier = "UI")
+fun Leaf(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Leaf):Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Leaf(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Wrapper(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Wrapper)<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    content(%composer, 0b1110 and %dirty)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Wrapper(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[0[0][0][0][0][0][0][0]]")
+fun Optional(one: Function2<Composer, Int, Unit>?, two: Function2<Composer, Int, Unit>?, three: Function2<Composer, Int, Unit>?, four: Function2<Composer, Int, Unit>?, five: Function2<Composer, Int, Unit>?, six: Function2<Composer, Int, Unit>?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Optional)P(3,6,5,2,1,4)<one()>,<conten...>:Test.kt")
+  val %dirty = %changed
+  if (%default and 0b0001 != 0) {
+    %dirty = %dirty or 0b0110
+  } else if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(one)) 0b0100 else 0b0010
+  }
+  if (%default and 0b0010 != 0) {
+    %dirty = %dirty or 0b00110000
+  } else if (%changed and 0b01110000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(two)) 0b00100000 else 0b00010000
+  }
+  if (%default and 0b0100 != 0) {
+    %dirty = %dirty or 0b000110000000
+  } else if (%changed and 0b001110000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(three)) 0b000100000000 else 0b10000000
+  }
+  if (%default and 0b1000 != 0) {
+    %dirty = %dirty or 0b110000000000
+  } else if (%changed and 0b0001110000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(four)) 0b100000000000 else 0b010000000000
+  }
+  if (%default and 0b00010000 != 0) {
+    %dirty = %dirty or 0b0110000000000000
+  } else if (%changed and 0b1110000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(five)) 0b0100000000000000 else 0b0010000000000000
+  }
+  if (%default and 0b00100000 != 0) {
+    %dirty = %dirty or 0b00110000000000000000
+  } else if (%changed and 0b01110000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(six)) 0b00100000000000000000 else 0b00010000000000000000
+  }
+  if (%default and 0b01000000 != 0) {
+    %dirty = %dirty or 0b000110000000000000000000
+  } else if (%changed and 0b001110000000000000000000 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b000100000000000000000000 else 0b10000000000000000000
+  }
+  if (%dirty and 0b001011011011011011011011 != 0b10010010010010010010 || !%composer.skipping) {
+    if (%default and 0b0001 != 0) {
+      one = ComposableSingletons%TestKt.lambda-1
+    }
+    if (%default and 0b0010 != 0) {
+      two = null
+    }
+    if (%default and 0b0100 != 0) {
+      three = null
+    }
+    if (%default and 0b1000 != 0) {
+      four = null
+    }
+    if (%default and 0b00010000 != 0) {
+      five = null
+    }
+    if (%default and 0b00100000 != 0) {
+      six = null
+    }
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    one(%composer, 0b1110 and %dirty)
+    two?.invoke(%composer, 0b1110 and %dirty shr 0b0011)
+    val tmp1_safe_receiver = three
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<it()>")
+    val tmp1_group = when {
+      tmp1_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp1_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
+          it(%composer, 0)
+        }
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmp1_group
+    val tmp2_safe_receiver = four
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<four()>")
+    val tmp2_group = when {
+      tmp2_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp2_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
+          four(%composer, 0b1110 and %dirty shr 0b1001)
+        }
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmp2_group
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "<five()>")
+    if (five != null) {
+      five(%composer, 0b1110 and %dirty shr 0b1100)
+    }
+    %composer.endReplaceableGroup()
+    val tmp3_safe_receiver = six
+    %composer.startReplaceableGroup(<>)
+    sourceInformation(%composer, "*<Wrappe...>")
+    val tmp3_group = when {
+      tmp3_safe_receiver == null -> {
+        null
+      }
+      else -> {
+        tmp3_safe_receiver.let { it: Function2<Composer, Int, Unit> ->
+          Wrapper(it, %composer, 0)
+        }
+      }
+    }
+    %composer.endReplaceableGroup()
+    tmp3_group
+    content(%composer, 0b1110 and %dirty shr 0b00010010)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Optional(one, two, three, four, five, six, content, %composer, updateChangedFlags(%changed or 0b0001), %default)
+  }
+}
+@Composable
+@ComposableTarget(applier = "UI")
+fun UseOptional(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(UseOptional)<Option...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    Optional(null, null, null, null, null, null, ComposableSingletons%TestKt.lambda-2, %composer, 0b000110000000000000000000, 0b00111111)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    UseOptional(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
+internal object ComposableSingletons%TestKt {
+  val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Unit
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+  val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+    sourceInformation(%composer, "C<Leaf()>:Test.kt")
+    if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      Leaf(%composer, 0)
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testReceiverScope\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testReceiverScope\133useFir = false\135.txt"
new file mode 100644
index 0000000..9efcacb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testReceiverScope\133useFir = false\135.txt"
@@ -0,0 +1,79 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+import androidx.compose.ui.layout.*
+import androidx.compose.foundation.text.*
+import androidx.compose.ui.text.*
+import androidx.compose.ui.text.style.*
+import androidx.compose.ui.*
+
+@Immutable
+interface LocalBoxScope {
+    @Stable
+    fun Modifier.align(alignment: Alignment): Modifier
+}
+
+object LocalBoxScopeInstance : LocalBoxScope {
+    override fun Modifier.align(alignment: Alignment): Modifier = Modifier
+}
+
+val localBoxMeasurePolicy = MeasurePolicy { _, constraints ->
+    layout(
+        constraints.minWidth,
+        constraints.minHeight
+    ) {}
+}
+
+@Composable
+inline fun LocalBox(
+    modifier: Modifier = Modifier,
+    content: @Composable LocalBoxScope.() -> Unit
+) {
+    Layout(
+        modifier = modifier,
+        measurePolicy = localBoxMeasurePolicy,
+        content = { LocalBoxScopeInstance.content() }
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Immutable
+interface LocalBoxScope {
+  @Stable
+  abstract fun Modifier.align(alignment: Alignment): Modifier
+}
+@StabilityInferred(parameters = 0)
+object LocalBoxScopeInstance : LocalBoxScope {
+  override fun Modifier.align(alignment: Alignment): Modifier {
+    return Companion
+  }
+  static val %stable: Int = 0
+}
+val localBoxMeasurePolicy: MeasurePolicy = MeasurePolicy { <unused var>: List<Measurable>, constraints: Constraints ->
+  %this%MeasurePolicy.layout(
+    width = constraints.minWidth,
+    height = constraints.minHeight
+  ) {
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
+fun LocalBox(modifier: Modifier?, content: @[ExtensionFunctionType] Function3<LocalBoxScope, Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(LocalBox)P(1)<Layout...>:Test.kt")
+  if (%default and 0b0001 != 0) {
+    modifier = Companion
+  }
+  val tmp0_measurePolicy = localBoxMeasurePolicy
+  Layout({ %composer: Composer?, %changed: Int ->
+    sourceInformationMarkerStart(%composer, <>, "C<conten...>:Test.kt")
+    content(LocalBoxScopeInstance, %composer, 0b0110 or 0b01110000 and %changed@LocalBox)
+    sourceInformationMarkerEnd(%composer)
+  }, modifier, tmp0_measurePolicy, %composer, 0b000110000000 or 0b01110000 and %changed shl 0b0011, 0)
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testReceiverScope\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testReceiverScope\133useFir = true\135.txt"
new file mode 100644
index 0000000..9efcacb
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testReceiverScope\133useFir = true\135.txt"
@@ -0,0 +1,79 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+import androidx.compose.ui.layout.*
+import androidx.compose.foundation.text.*
+import androidx.compose.ui.text.*
+import androidx.compose.ui.text.style.*
+import androidx.compose.ui.*
+
+@Immutable
+interface LocalBoxScope {
+    @Stable
+    fun Modifier.align(alignment: Alignment): Modifier
+}
+
+object LocalBoxScopeInstance : LocalBoxScope {
+    override fun Modifier.align(alignment: Alignment): Modifier = Modifier
+}
+
+val localBoxMeasurePolicy = MeasurePolicy { _, constraints ->
+    layout(
+        constraints.minWidth,
+        constraints.minHeight
+    ) {}
+}
+
+@Composable
+inline fun LocalBox(
+    modifier: Modifier = Modifier,
+    content: @Composable LocalBoxScope.() -> Unit
+) {
+    Layout(
+        modifier = modifier,
+        measurePolicy = localBoxMeasurePolicy,
+        content = { LocalBoxScopeInstance.content() }
+    )
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Immutable
+interface LocalBoxScope {
+  @Stable
+  abstract fun Modifier.align(alignment: Alignment): Modifier
+}
+@StabilityInferred(parameters = 0)
+object LocalBoxScopeInstance : LocalBoxScope {
+  override fun Modifier.align(alignment: Alignment): Modifier {
+    return Companion
+  }
+  static val %stable: Int = 0
+}
+val localBoxMeasurePolicy: MeasurePolicy = MeasurePolicy { <unused var>: List<Measurable>, constraints: Constraints ->
+  %this%MeasurePolicy.layout(
+    width = constraints.minWidth,
+    height = constraints.minHeight
+  ) {
+  }
+}
+@Composable
+@ComposableInferredTarget(scheme = "[androidx.compose.ui.UiComposable[androidx.compose.ui.UiComposable]]")
+fun LocalBox(modifier: Modifier?, content: @[ExtensionFunctionType] Function3<LocalBoxScope, Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(LocalBox)P(1)<Layout...>:Test.kt")
+  if (%default and 0b0001 != 0) {
+    modifier = Companion
+  }
+  val tmp0_measurePolicy = localBoxMeasurePolicy
+  Layout({ %composer: Composer?, %changed: Int ->
+    sourceInformationMarkerStart(%composer, <>, "C<conten...>:Test.kt")
+    content(LocalBoxScopeInstance, %composer, 0b0110 or 0b01110000 and %changed@LocalBox)
+    sourceInformationMarkerEnd(%composer)
+  }, modifier, tmp0_measurePolicy, %composer, 0b000110000000 or 0b01110000 and %changed shl 0b0011, 0)
+  %composer.endReplaceableGroup()
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testRememberUpdatedState\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testRememberUpdatedState\133useFir = false\135.txt"
new file mode 100644
index 0000000..ce41a8f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testRememberUpdatedState\133useFir = false\135.txt"
@@ -0,0 +1,78 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(content: @Composable () -> Unit) {
+    val updatedContent by rememberUpdatedState(content)
+    Defer {
+        UiContent {
+            updatedContent()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[UI[UI]]")
+fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val updatedContent by {
+      val updatedContent%delegate = rememberUpdatedState(content, %composer, 0b1110 and %dirty)
+      get() {
+        return updatedContent%delegate.getValue(null, ::updatedContent%delegate)
+      }
+    }
+    Defer(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        UiContent(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+          sourceInformation(%composer, "C<update...>:Test.kt")
+          if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %changed, -1, <>)
+            }
+            <get-updatedContent>()(%composer, 0)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+        }
+        )
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    )
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testRememberUpdatedState\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testRememberUpdatedState\133useFir = true\135.txt"
new file mode 100644
index 0000000..ce41a8f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TargetAnnotationsTransformTests/testRememberUpdatedState\133useFir = true\135.txt"
@@ -0,0 +1,78 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+fun Test(content: @Composable () -> Unit) {
+    val updatedContent by rememberUpdatedState(content)
+    Defer {
+        UiContent {
+            updatedContent()
+        }
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[UI[UI]]")
+fun Test(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changedInstance(content)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    val updatedContent by {
+      val updatedContent%delegate = rememberUpdatedState(content, %composer, 0b1110 and %dirty)
+      get() {
+        return updatedContent%delegate.getValue(null, ::updatedContent%delegate)
+      }
+    }
+    Defer(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+      sourceInformation(%composer, "C:Test.kt")
+      if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+        if (isTraceInProgress()) {
+          traceEventStart(<>, %changed, -1, <>)
+        }
+        UiContent(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+          sourceInformation(%composer, "C<update...>:Test.kt")
+          if (%changed and 0b1011 != 0b0010 || !%composer.skipping) {
+            if (isTraceInProgress()) {
+              traceEventStart(<>, %changed, -1, <>)
+            }
+            <get-updatedContent>()(%composer, 0)
+            if (isTraceInProgress()) {
+              traceEventEnd()
+            }
+          } else {
+            %composer.skipToGroupEnd()
+          }
+        }
+        )
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+      } else {
+        %composer.skipToGroupEnd()
+      }
+    }
+    )
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(content, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testBasicComposableFunctions\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testBasicComposableFunctions\133useFir = false\135.txt"
new file mode 100644
index 0000000..f24438b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testBasicComposableFunctions\133useFir = false\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class A {
+  @Composable fun B(x: Int) { }
+}
+
+@Composable
+fun C() { A().B(1337) }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class A {
+  @Composable
+  fun B(x: Int, %composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(B):Test.kt")
+    if (%changed and 0b0001 != 0 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.B(x, %composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 0
+}
+@Composable
+fun C(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(C)<B(1337...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A().B(1337, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    C(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testBasicComposableFunctions\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testBasicComposableFunctions\133useFir = true\135.txt"
new file mode 100644
index 0000000..f24438b
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testBasicComposableFunctions\133useFir = true\135.txt"
@@ -0,0 +1,59 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.Composable
+
+class A {
+  @Composable fun B(x: Int) { }
+}
+
+@Composable
+fun C() { A().B(1337) }
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@StabilityInferred(parameters = 0)
+class A {
+  @Composable
+  fun B(x: Int, %composer: Composer?, %changed: Int) {
+    %composer = %composer.startRestartGroup(<>)
+    sourceInformation(%composer, "C(B):Test.kt")
+    if (%changed and 0b0001 != 0 || !%composer.skipping) {
+      if (isTraceInProgress()) {
+        traceEventStart(<>, %changed, -1, <>)
+      }
+      if (isTraceInProgress()) {
+        traceEventEnd()
+      }
+    } else {
+      %composer.skipToGroupEnd()
+    }
+    val tmp0_rcvr = <this>
+    %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+      tmp0_rcvr.B(x, %composer, updateChangedFlags(%changed or 0b0001))
+    }
+  }
+  static val %stable: Int = 0
+}
+@Composable
+fun C(%composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(C)<B(1337...>:Test.kt")
+  if (%changed != 0 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %changed, -1, <>)
+    }
+    A().B(1337, %composer, 0b0110)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    C(%composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testInlineFunctionsDonotGenerateTraceMarkers\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testInlineFunctionsDonotGenerateTraceMarkers\133useFir = false\135.txt"
new file mode 100644
index 0000000..c217496
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testInlineFunctionsDonotGenerateTraceMarkers\133useFir = false\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+inline fun Wrapper(content: @Composable () -> Unit) = content()
+
+@Composable
+fun Test(condition: Boolean) {
+    A()
+    Wrapper {
+        A()
+        if (!condition) return
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Wrapper(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Wrapper)<conten...>:Test.kt")
+  content(%composer, 0b1110 and %changed)
+  %composer.endReplaceableGroup()
+}
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>,<Wrappe...>,<A()>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    Wrapper({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (!condition) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testInlineFunctionsDonotGenerateTraceMarkers\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testInlineFunctionsDonotGenerateTraceMarkers\133useFir = true\135.txt"
new file mode 100644
index 0000000..c217496
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testInlineFunctionsDonotGenerateTraceMarkers\133useFir = true\135.txt"
@@ -0,0 +1,74 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+inline fun Wrapper(content: @Composable () -> Unit) = content()
+
+@Composable
+fun Test(condition: Boolean) {
+    A()
+    Wrapper {
+        A()
+        if (!condition) return
+        A()
+    }
+    A()
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ComposableInferredTarget(scheme = "[0[0]]")
+fun Wrapper(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+  %composer.startReplaceableGroup(<>)
+  sourceInformation(%composer, "CC(Wrapper)<conten...>:Test.kt")
+  content(%composer, 0b1110 and %changed)
+  %composer.endReplaceableGroup()
+}
+@Composable
+fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+  %composer = %composer.startRestartGroup(<>)
+  sourceInformation(%composer, "C(Test)<A()>,<Wrappe...>,<A()>:Test.kt")
+  val tmp0_marker = %composer.currentMarker
+  val %dirty = %changed
+  if (%changed and 0b1110 == 0) {
+    %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+  }
+  if (%dirty and 0b1011 != 0b0010 || !%composer.skipping) {
+    if (isTraceInProgress()) {
+      traceEventStart(<>, %dirty, -1, <>)
+    }
+    A(%composer, 0)
+    Wrapper({ %composer: Composer?, %changed: Int ->
+      %composer.startReplaceableGroup(<>)
+      sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+      A(%composer, 0)
+      if (!condition) {
+        %composer.endToMarker(tmp0_marker)
+        if (isTraceInProgress()) {
+          traceEventEnd()
+        }
+        %[email protected]()?.updateScope { %composer: Composer?, %force: Int ->
+          Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+        }
+        return
+      }
+      A(%composer, 0)
+      %composer.endReplaceableGroup()
+    }, %composer, 0)
+    A(%composer, 0)
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+  } else {
+    %composer.skipToGroupEnd()
+  }
+  %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+    Test(condition, %composer, updateChangedFlags(%changed or 0b0001))
+  }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testReadOnlyComposable\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testReadOnlyComposable\133useFir = false\135.txt"
new file mode 100644
index 0000000..fc9237f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testReadOnlyComposable\133useFir = false\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@ReadOnlyComposable
+internal fun someFun(a: Boolean): Boolean {
+    if (a) {
+        return a
+    } else {
+        return a
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ReadOnlyComposable
+internal fun someFun(a: Boolean, %composer: Composer?, %changed: Int): Boolean {
+  sourceInformationMarkerStart(%composer, <>, "C(someFun):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (a) {
+    val tmp0_return = a
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp0_return
+  } else {
+    val tmp1_return = a
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp1_return
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testReadOnlyComposable\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testReadOnlyComposable\133useFir = true\135.txt"
new file mode 100644
index 0000000..fc9237f
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.TraceInformationTest/testReadOnlyComposable\133useFir = true\135.txt"
@@ -0,0 +1,47 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable
+@ReadOnlyComposable
+internal fun someFun(a: Boolean): Boolean {
+    if (a) {
+        return a
+    } else {
+        return a
+    }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+@ReadOnlyComposable
+internal fun someFun(a: Boolean, %composer: Composer?, %changed: Int): Boolean {
+  sourceInformationMarkerStart(%composer, <>, "C(someFun):Test.kt")
+  if (isTraceInProgress()) {
+    traceEventStart(<>, %changed, -1, <>)
+  }
+  if (a) {
+    val tmp0_return = a
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp0_return
+  } else {
+    val tmp1_return = a
+    if (isTraceInProgress()) {
+      traceEventEnd()
+    }
+    sourceInformationMarkerEnd(%composer)
+    return tmp1_return
+  }
+  if (isTraceInProgress()) {
+    traceEventEnd()
+  }
+  sourceInformationMarkerEnd(%composer)
+}
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 c23938d..588edf1 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
@@ -3189,6 +3189,11 @@
                             }
                         }
                         return true
+                    } else {
+                        // If the capture is outside inline lambda, we don't allow meta propagation
+                        if (!inlineLambdaInfo.isInlineLambda(scope.function)) {
+                            return false
+                        }
                     }
                 }
                 else -> {
diff --git a/compose/compiler/design/compiler-metrics.md b/compose/compiler/design/compiler-metrics.md
index 01cb999..fa8032b 100644
--- a/compose/compiler/design/compiler-metrics.md
+++ b/compose/compiler/design/compiler-metrics.md
@@ -31,10 +31,10 @@
 To enable metrics for a gradle module, include:
 
 ```
-compileKotlin {
-    freeCompilerArgs += listOf(
+tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>() {
+    compilerOptions.freeCompilerArgs.addAll(
         "-P",
-        "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=<directory>"
+        "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=<directory>",
     )
 }
 ```
@@ -44,10 +44,10 @@
 To enabled reports for a gradle module, include:
 
 ```
-compileKotlin {
-    freeCompilerArgs += listOf(
+tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>() {
+    compilerOptions.freeCompilerArgs.addAll(
         "-P",
-        "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=<directory>"
+        "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=<directory>",
     )
 }
 ```
diff --git a/compose/foundation/foundation/api/api_lint.ignore b/compose/foundation/foundation/api/api_lint.ignore
index 0e31469..cc77cb9 100644
--- a/compose/foundation/foundation/api/api_lint.ignore
+++ b/compose/foundation/foundation/api/api_lint.ignore
@@ -23,8 +23,6 @@
     Getter for boolean property `canScrollBackward` is named `getCanScrollBackward` but should match the property name. Use `@get:JvmName` to rename.
 GetterSetterNames: androidx.compose.foundation.pager.PagerState#getCanScrollForward():
     Getter for boolean property `canScrollForward` is named `getCanScrollForward` but should match the property name. Use `@get:JvmName` to rename.
-GetterSetterNames: androidx.compose.foundation.text2.input.TextFieldBufferWithSelection#getHasSelection():
-    Getter for boolean property `hasSelection` is named `getHasSelection` but should match the property name. Use `@get:JvmName` to rename.
 GetterSetterNames: field KeyboardOptions.autoCorrect:
     Invalid name for boolean property `autoCorrect`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field LazyGridLayoutInfo.reverseLayout:
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushAnimatingSpanDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushAnimatingSpanDemo.kt
new file mode 100644
index 0000000..82f1324
--- /dev/null
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/BrushAnimatingSpanDemo.kt
@@ -0,0 +1,302 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.demos.text
+
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.AnimationVector1D
+import androidx.compose.animation.core.LinearEasing
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material.Button
+import androidx.compose.material.Slider
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.LinearGradientShader
+import androidx.compose.ui.graphics.Shader
+import androidx.compose.ui.graphics.ShaderBrush
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.buildAnnotatedString
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.withStyle
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import kotlin.math.roundToInt
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+
+@Composable
+fun BrushAnimatingSpanDemo() {
+    val animatable = remember { Animatable(0f) }
+    val animatable2 = remember { Animatable(0f) }
+    val coroutineScope = rememberCoroutineScope()
+
+    var preWordCount by remember { mutableIntStateOf(5) }
+    var highlightWordCount by remember { mutableIntStateOf(15) }
+    var postWordCount by remember { mutableIntStateOf(5) }
+
+    Box(
+        modifier = Modifier
+            .fillMaxSize()
+            .padding(16.dp)
+    ) {
+        Column {
+
+            Text("Pre Word Count")
+            Slider(
+                value = preWordCount.toFloat(),
+                onValueChange = { preWordCount = it.roundToInt() },
+                valueRange = 0f..16f,
+                steps = 16
+            )
+
+            Text("Highlight Word Count")
+            Slider(
+                value = highlightWordCount.toFloat(),
+                onValueChange = { highlightWordCount = it.roundToInt() },
+                valueRange = 0f..20f,
+                steps = 16
+            )
+
+            Text("Post Word Count")
+            Slider(
+                value = postWordCount.toFloat(),
+                onValueChange = { postWordCount = it.roundToInt() },
+                valueRange = 0f..16f,
+                steps = 16
+            )
+
+            BrushAnimatingSpanText(
+                preWordCount = preWordCount,
+                highlightWordCount = highlightWordCount,
+                postWordCount = postWordCount,
+                animatable = animatable,
+                animatable2 = animatable2
+            )
+            Button(onClick = {
+                coroutineScope.launch {
+                    animatable.snapTo(0f)
+                    animatable2.snapTo(0f)
+                    launch {
+                        animatable2.animateTo(
+                            1f,
+                            tween(highlightWordCount * 100, easing = LinearEasing)
+                        )
+                    }
+                    delay(300)
+                    launch {
+                        animatable.animateTo(
+                            1f,
+                            tween(highlightWordCount * 100, easing = LinearEasing)
+                        )
+                    }
+                }
+            }) {
+                Text("Go")
+            }
+            Button(onClick = {
+                coroutineScope.launch {
+                    animatable.snapTo(0f)
+                    animatable2.snapTo(0f)
+                }
+            }) {
+                Text("Reset")
+            }
+        }
+    }
+}
+
+@Composable
+fun BrushAnimatingSpanText(
+    preWordCount: Int,
+    highlightWordCount: Int,
+    postWordCount: Int,
+    animatable: Animatable<Float, AnimationVector1D>,
+    animatable2: Animatable<Float, AnimationVector1D>
+) {
+    val (text, start, end) = remember(preWordCount, highlightWordCount, postWordCount) {
+        var start = 0
+        var end = 0
+        val text = buildAnnotatedString {
+            append(loremIpsum(wordCount = preWordCount))
+            start = length
+            withStyle(SpanStyle(fontWeight = FontWeight.Bold)) {
+                append(loremIpsum(wordCount = highlightWordCount))
+            }
+            end = length
+            append(loremIpsum(wordCount = postWordCount))
+        }
+        Triple(text, start, end)
+    }
+
+    val textLayoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
+
+    val finalText = remember(text, start, end, textLayoutResult.value?.layoutInput?.text?.text) {
+        calculateAnnotatedString(
+            text,
+            start,
+            end,
+            textLayoutResult.value,
+            animatable,
+            animatable2
+        )
+    }
+
+    Text(
+        text = finalText,
+        fontSize = 20.sp,
+        onTextLayout = {
+            textLayoutResult.value = it
+        })
+}
+
+fun calculateAnnotatedString(
+    text: AnnotatedString,
+    start: Int,
+    end: Int,
+    textLayoutResult: TextLayoutResult?,
+    animatable: Animatable<Float, AnimationVector1D>,
+    animatable2: Animatable<Float, AnimationVector1D>
+): AnnotatedString {
+    textLayoutResult ?: return text
+    val startLine = textLayoutResult.getLineForOffset(start)
+    val endLine = textLayoutResult.getLineForOffset(end)
+    val lines = mutableListOf<Segment>()
+    val firstLineLeft = textLayoutResult.getBoundingBox(start).left
+    val lastLineRight = textLayoutResult.getBoundingBox(end).right
+
+    if (startLine == endLine) {
+        lines += Segment(
+            leftPosition = firstLineLeft,
+            rightPosition = lastLineRight,
+            leftOffset = start,
+            rightOffset = end
+        )
+    } else {
+        for (i in (startLine..endLine)) {
+            lines += when (i) {
+                startLine -> {
+                    Segment(
+                        leftPosition = firstLineLeft,
+                        rightPosition = textLayoutResult.getLineRight(i),
+                        leftOffset = start,
+                        rightOffset = textLayoutResult.getLineEnd(i)
+                    )
+                }
+
+                endLine -> {
+                    Segment(
+                        leftPosition = textLayoutResult.getLineLeft(i),
+                        rightPosition = lastLineRight,
+                        leftOffset = textLayoutResult.getLineStart(i),
+                        rightOffset = end
+                    )
+                }
+
+                else -> {
+                    Segment(
+                        leftPosition = textLayoutResult.getLineLeft(i),
+                        rightPosition = textLayoutResult.getLineRight(i),
+                        leftOffset = textLayoutResult.getLineStart(i),
+                        rightOffset = textLayoutResult.getLineEnd(i)
+                    )
+                }
+            }
+        }
+    }
+
+    val brushSpans = (lines).mapIndexed { index, segment ->
+        AnnotatedString.Range(
+            item = SpanStyle(
+                brush = object : ShaderBrush() {
+                    override fun createShader(size: Size): Shader {
+                        val animationValue = animatable.value
+                        val animationValue2 = animatable2.value
+                        return LinearGradientShader(
+                            from = Offset(
+                                x = segment.leftPosition - lines.allLeftWidth(index),
+                                y = 0f
+                            ),
+                            to = Offset(
+                                x = segment.rightPosition + lines.allRightWidth(index),
+                                y = 0f
+                            ),
+                            colors = listOf(
+                                Color.Blue,
+                                Color.Blue,
+                                Color.Gray,
+                                Color.Black,
+                                Color.Black
+                            ),
+                            colorStops = listOf(
+                                0f,
+                                animationValue,
+                                (animationValue + animationValue2) / 2,
+                                animationValue2,
+                                1f
+                            )
+                        )
+                    }
+                }
+            ),
+            start = segment.leftOffset,
+            end = segment.rightOffset
+        )
+    }
+    return AnnotatedString(
+        text.text,
+        paragraphStyles = text.paragraphStyles,
+        spanStyles = text.spanStyles + brushSpans
+    )
+}
+
+data class Segment(
+    val leftPosition: Float,
+    val rightPosition: Float,
+    val leftOffset: Int,
+    val rightOffset: Int,
+)
+
+fun List<Segment>.allLeftWidth(index: Int): Float {
+    var totalWidth = 0f
+    for (i in 0 until index) {
+        totalWidth += this[index].rightPosition - this[index].leftPosition
+    }
+    return totalWidth
+}
+
+fun List<Segment>.allRightWidth(index: Int): Float {
+    var totalWidth = 0f
+    for (i in index + 1 until this.size) {
+        totalWidth += this[index].rightPosition - this[index].leftPosition
+    }
+    return totalWidth
+}
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
index 74df42c..4a1d00a 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
@@ -59,7 +59,7 @@
 @Composable
 fun TextFontPaddingDemo() {
     Column(Modifier.verticalScroll(rememberScrollState())) {
-        FontPaddingRow("ABCDEfgHIjKgpvyzgpvyzgpvyzgpvyz")
+        FontPaddingRow("ABCDEfgHIjKLMNOPQRSTUVWXYZ")
         FontPaddingRow("مرحبا" + "ဪไန််မ့်၇ဤဩဦနိမြသကိမ့်" + "مرحبا" + "ဪไန််မ့်၇ဤဩဦနိမြသကိမ့်")
         CenteredInContainerRow()
         CenterInCircleRow()
@@ -81,7 +81,6 @@
         for (text in arrayOf(latinText, tallText)) {
             Box {
                 Column(padding.width(width)) {
-                    @Suppress("DEPRECATION")
                     Text(
                         text,
                         style = style.copy(
@@ -91,7 +90,6 @@
                     )
                 }
                 Column(padding.width(width)) {
-                    @Suppress("DEPRECATION")
                     Text(
                         text,
                         style = style.copy(
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/PlatformTextInputAdapterDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/PlatformTextInputAdapterDemo.kt
index ec299d1..7b6d82f 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/PlatformTextInputAdapterDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/PlatformTextInputAdapterDemo.kt
@@ -66,7 +66,7 @@
 import androidx.compose.ui.node.currentValueOf
 import androidx.compose.ui.platform.LocalSoftwareKeyboardController
 import androidx.compose.ui.platform.PlatformTextInputModifierNode
-import androidx.compose.ui.platform.textInputSession
+import androidx.compose.ui.platform.runTextInputSession
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.unit.IntSize
@@ -193,7 +193,7 @@
 
                 // In a real app, creating this session would be platform-specific code.
                 // This will cancel any previous request.
-                textInputSession {
+                runTextInputSession {
                     val imm = view.context
                         .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
index 13a1cef..0df91ef 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
@@ -42,6 +42,7 @@
             "Text Canvas",
             listOf(
                 ComposableDemo("Brush") { TextBrushDemo() },
+                ComposableDemo("Brush Span") { BrushAnimatingSpanDemo() },
                 ComposableDemo("drawText") { DrawTextDemo() },
                 ComposableDemo("Stroke") { TextStrokeDemo() }
             )
diff --git a/compose/foundation/foundation/lint-baseline.xml b/compose/foundation/foundation/lint-baseline.xml
index f68c010..0815416 100644
--- a/compose/foundation/foundation/lint-baseline.xml
+++ b/compose/foundation/foundation/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanSuppressTag"
@@ -949,8 +949,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in constructor DraggableNode has parameter &apos;onDragStarted&apos; with type Function3&lt;? super CoroutineScope, ? super Offset, ? super Continuation&lt;? super Unit>, ? extends Object>."
-        errorLine1="    private var onDragStarted: suspend CoroutineScope.(startedPosition: Offset) -> Unit,"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    onDragStarted: suspend CoroutineScope.(startedPosition: Offset) -> Unit,"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt"/>
     </issue>
@@ -958,8 +958,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in constructor DraggableNode has parameter &apos;onDragStopped&apos; with type Function3&lt;? super CoroutineScope, ? super Velocity, ? super Continuation&lt;? super Unit>, ? extends Object>."
-        errorLine1="    private var onDragStopped: suspend CoroutineScope.(velocity: Velocity) -> Unit,"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    onDragStopped: suspend CoroutineScope.(velocity: Velocity) -> Unit,"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt"/>
     </issue>
@@ -984,15 +984,6 @@
 
     <issue
         id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable &apos;postPointerSlop&apos; with type Function2&lt;? super PointerInputChange, ? super Offset, ? extends Unit>."
-        errorLine1="        val postPointerSlop = { event: PointerInputChange, offset: Offset ->"
-        errorLine2="        ^">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in constructor DefaultDraggableState has parameter &apos;onDelta&apos; with type Function1&lt;? super Float, Unit>."
         errorLine1="private class DefaultDraggableState(val onDelta: (Float) -> Unit) : DraggableState {"
         errorLine2="                                                 ~~~~~~~~~~~~~~~">
@@ -1804,8 +1795,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method magnifier has parameter &apos;magnifierCenter&apos; with type Function1&lt;? super Density, Offset>."
-        errorLine1="    magnifierCenter: Density.() -> Offset = { Offset.Unspecified },"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    magnifierCenter: (Density.() -> Offset)? = null,"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt"/>
     </issue>
@@ -1831,8 +1822,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method magnifier has parameter &apos;magnifierCenter&apos; with type Function1&lt;? super Density, Offset>."
-        errorLine1="    magnifierCenter: Density.() -> Offset = { Offset.Unspecified },"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    magnifierCenter: (Density.() -> Offset)? = null,"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt"/>
     </issue>
@@ -1858,8 +1849,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in constructor MagnifierElement has parameter &apos;magnifierCenter&apos; with type Function1&lt;? super Density, Offset>."
-        errorLine1="    private val magnifierCenter: Density.() -> Offset = { Offset.Unspecified },"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    private val magnifierCenter: (Density.() -> Offset)? = null,"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt"/>
     </issue>
@@ -1903,8 +1894,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in constructor MagnifierNode has parameter &apos;magnifierCenter&apos; with type Function1&lt;? super Density, Offset>."
-        errorLine1="    var magnifierCenter: Density.() -> Offset = { Offset.Unspecified },"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    var magnifierCenter: (Density.() -> Offset)? = null,"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt"/>
     </issue>
@@ -1912,8 +1903,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method setMagnifierCenter has parameter &apos;&lt;set-?>&apos; with type Function1&lt;? super Density, Offset>."
-        errorLine1="    var magnifierCenter: Density.() -> Offset = { Offset.Unspecified },"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    var magnifierCenter: (Density.() -> Offset)? = null,"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt"/>
     </issue>
@@ -1921,8 +1912,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in return type Function1&lt;Density, Offset> of &apos;getMagnifierCenter&apos;."
-        errorLine1="    var magnifierCenter: Density.() -> Offset = { Offset.Unspecified },"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    var magnifierCenter: (Density.() -> Offset)? = null,"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt"/>
     </issue>
@@ -1966,8 +1957,8 @@
     <issue
         id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method update has parameter &apos;magnifierCenter&apos; with type Function1&lt;? super Density, Offset>."
-        errorLine1="        magnifierCenter: Density.() -> Offset,"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="        magnifierCenter: (Density.() -> Offset)?,"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt"/>
     </issue>
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidExternalSurfaceTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidExternalSurfaceTest.kt
index ba929f0..73fa137 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidExternalSurfaceTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/AndroidExternalSurfaceTest.kt
@@ -16,9 +16,6 @@
 
 package androidx.compose.foundation
 
-import android.app.Activity
-import android.content.Context
-import android.content.ContextWrapper
 import android.graphics.Bitmap
 import android.graphics.PorterDuff
 import android.graphics.Rect
@@ -26,12 +23,14 @@
 import android.os.Handler
 import android.os.Looper
 import android.view.Choreographer
+import android.view.Gravity
 import android.view.PixelCopy
 import android.view.Surface
 import android.view.View
-import android.view.ViewTreeObserver
-import android.view.Window
+import android.view.WindowManager
+import android.widget.TextView
 import androidx.annotation.RequiresApi
+import androidx.annotation.UiThread
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.size
 import androidx.compose.runtime.getValue
@@ -57,17 +56,16 @@
 import androidx.compose.ui.test.onRoot
 import androidx.compose.ui.unit.dp
 import androidx.concurrent.futures.ResolvableFuture
+import androidx.core.content.getSystemService
 import androidx.core.graphics.ColorUtils
 import androidx.core.graphics.createBitmap
-import androidx.test.annotation.ExperimentalTestApi
+import androidx.core.view.doOnPreDraw
 import androidx.test.core.internal.os.HandlerExecutor
-import androidx.test.core.view.forceRedraw
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.platform.graphics.HardwareRendererCompat
-import com.google.common.util.concurrent.ListenableFuture
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.ExecutionException
 import java.util.concurrent.TimeUnit
@@ -518,59 +516,62 @@
 
     val node = fetchSemanticsNode()
     val view = (node.root as ViewRootForTest).view
-    val window = view.context.getActivityWindow()
 
     return withDrawingEnabled {
         val bitmapFuture: ResolvableFuture<Bitmap> = ResolvableFuture.create()
 
+        var cleanup = { }
+
         val mainExecutor = HandlerExecutor(Handler(Looper.getMainLooper()))
         mainExecutor.execute {
-            // We are testing SurfaceViews, ensure we have a hole punch
-            window.decorView.forceRelayout()
-            window.decorView.forceRedraw()
+            cleanup = view.waitForWindowManager {
+                Choreographer.getInstance().postFrameCallback {
+                    val location = IntArray(2)
+                    view.getLocationOnScreen(location)
 
-            Choreographer.getInstance().postFrameCallback {
-                val location = IntArray(2)
-                view.getLocationOnScreen(location)
+                    val bounds = node.boundsInRoot.translate(
+                        location[0].toFloat(),
+                        location[1].toFloat()
+                    ).deflate(1.0f) // inset the rectangle to avoid rounding errors
 
-                val bounds = node.boundsInRoot.translate(
-                    location[0].toFloat(),
-                    location[1].toFloat()
-                ).deflate(1.0f) // inset the rectangle to avoid rounding errors
-
-                // do multiple retries of uiAutomation.takeScreenshot because it is known to return null
-                // on API 31+ b/257274080
-                var bitmap: Bitmap? = null
-                var i = 0
-                while (i < 3 && bitmap == null) {
-                    bitmap = uiAutomation.takeScreenshot()
-                    i++
-                }
-
-                if (bitmap != null) {
-                    bitmap = Bitmap.createBitmap(
-                        bitmap,
-                        bounds.left.toInt(),
-                        bounds.top.toInt(),
-                        bounds.width.toInt(),
-                        bounds.height.toInt()
-                    )
-                    bitmapFuture.set(bitmap)
-                } else {
-                    if (hasSecureSurfaces) {
-                        // may be null on older API levels when a secure surface is showing
-                        bitmapFuture.set(null)
+                    // do multiple retries of uiAutomation.takeScreenshot because it is
+                    // known to return null on API 31+ b/257274080
+                    var bitmap: Bitmap? = null
+                    var i = 0
+                    while (i < 3 && bitmap == null) {
+                        bitmap = uiAutomation.takeScreenshot()
+                        i++
                     }
-                    // if we don't show secure surfaces, let the future timeout on get()
+
+                    if (bitmap != null) {
+                        bitmap = Bitmap.createBitmap(
+                            bitmap,
+                            bounds.left.toInt(),
+                            bounds.top.toInt(),
+                            bounds.width.toInt(),
+                            bounds.height.toInt()
+                        )
+                        bitmapFuture.set(bitmap)
+                    } else {
+                        if (hasSecureSurfaces) {
+                            // may be null on older API levels when a secure surface is showing
+                            bitmapFuture.set(null)
+                        }
+                        // if we don't show secure surfaces, let the future timeout on get()
+                    }
                 }
             }
         }
 
-        try {
+        val bitmap = try {
             bitmapFuture.get(5, TimeUnit.SECONDS)?.asImageBitmap()
         } catch (e: ExecutionException) {
             null
         }
+
+        cleanup()
+
+        bitmap
     }
 }
 
@@ -618,41 +619,38 @@
     }
 }
 
-private fun Context.getActivityWindow(): Window {
-    fun Context.getActivity(): Activity {
-        return when (this) {
-            is Activity -> this
-            is ContextWrapper -> this.baseContext.getActivity()
-            else -> throw IllegalStateException(
-                "Context is not an Activity context, but a ${javaClass.simpleName} context. " +
-                    "An Activity context is required to get a Window instance"
-            )
-        }
+/**
+ * Waits for the WindowManager to be "ready" and then runs [onWindowManagerReady].
+ * The wait is implemented by creating a new window and waiting for its content to
+ * draw once. Doing so should in theory guarantee that SurfaceViews from the parent
+ * window are also ready and visible, and thus reduce flakes.
+ *
+ * This method returns a lambda that must be executed to perform cleanup before
+ * the test finishes and the activity is torn down.
+ */
+@UiThread
+private fun View.waitForWindowManager(onWindowManagerReady: () -> Unit): () -> Unit {
+    val subWindow = TextView(context).apply {
+        text = "WM Ready"
+        setBackgroundColor(Color.White.toArgb())
     }
-    return getActivity().window
-}
 
-@RequiresApi(Build.VERSION_CODES.JELLY_BEAN)
-@ExperimentalTestApi
-fun View.forceRelayout(): ListenableFuture<Void> {
-    val future: ResolvableFuture<Void> = ResolvableFuture.create()
-
-    viewTreeObserver.addOnGlobalLayoutListener(
-        object : ViewTreeObserver.OnGlobalLayoutListener {
-            var handled = false
-            override fun onGlobalLayout() {
-                if (!handled) {
-                    handled = true
-                    future.set(null)
-                    Handler(Looper.getMainLooper()).post {
-                        viewTreeObserver.removeOnGlobalLayoutListener(this)
-                    }
-                }
-            }
+    val windowManager = context.getSystemService<WindowManager>()!!
+    windowManager.addView(
+        subWindow,
+        WindowManager.LayoutParams(
+            WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
+            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+        ).apply {
+            width = WindowManager.LayoutParams.WRAP_CONTENT
+            height = WindowManager.LayoutParams.WRAP_CONTENT
+            gravity = Gravity.RIGHT or Gravity.BOTTOM
         }
     )
 
-    requestLayout()
+    subWindow.doOnPreDraw {
+        onWindowManagerReady()
+    }
 
-    return future
+    return { windowManager.removeView(subWindow) }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableGestureTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableGestureTest.kt
index 59b8466..c058a64 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableGestureTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/anchoredDraggable/AnchoredDraggableGestureTest.kt
@@ -322,6 +322,68 @@
     }
 
     @Test
+    fun anchoredDraggable_negative_offset_targetState() {
+        val positionalThreshold = 0.5f
+        val absThreshold = abs(positionalThreshold)
+        val state = AnchoredDraggableState(
+            initialValue = A,
+            positionalThreshold = { distance -> distance * positionalThreshold },
+            velocityThreshold = DefaultVelocityThreshold,
+            animationSpec = tween()
+        )
+        rule.setContent {
+            Box(Modifier.fillMaxSize()) {
+                Box(
+                    Modifier
+                        .requiredSize(AnchoredDraggableBoxSize)
+                        .testTag(AnchoredDraggableTestTag)
+                        .anchoredDraggable(
+                            state = state,
+                            orientation = Orientation.Horizontal
+                        )
+                        .onSizeChanged { layoutSize ->
+                            val anchors = DraggableAnchors {
+                                A at 0f
+                                B at -layoutSize.width.toFloat()
+                            }
+                            state.updateAnchors(anchors)
+                        }
+                        .offset {
+                            IntOffset(
+                                state
+                                    .requireOffset()
+                                    .roundToInt(), 0
+                            )
+                        }
+                        .background(Color.Red)
+                )
+            }
+        }
+
+        val positionOfA = state.anchors.positionOf(A)
+        val positionOfB = state.anchors.positionOf(B)
+        val distance = abs(positionOfA - positionOfB)
+
+        rule.onNodeWithTag(AnchoredDraggableTestTag)
+            .performTouchInput { swipeLeft(startX = right, endX = left) }
+        rule.waitForIdle()
+
+        assertThat(state.currentValue).isEqualTo(B)
+        assertThat(state.targetValue).isEqualTo(B)
+
+        state.dispatchRawDelta(distance * (absThreshold * 1.1f))
+        rule.waitForIdle()
+
+        assertThat(state.currentValue).isEqualTo(B)
+        assertThat(state.targetValue).isEqualTo(A)
+
+        runBlocking(AutoTestFrameClock()) { state.settle(velocity = 0f) }
+
+        assertThat(state.currentValue).isEqualTo(A)
+        assertThat(state.targetValue).isEqualTo(A)
+    }
+
+    @Test
     fun anchoredDraggable_positionalThresholds_fractional_targetState() {
         val positionalThreshold = 0.5f
         val absThreshold = abs(positionalThreshold)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/ClippedTextSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/ClippedTextSelectionGesturesTest.kt
index b0c0415..f5403fb 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/ClippedTextSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/ClippedTextSelectionGesturesTest.kt
@@ -20,21 +20,29 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.text.BasicText
+import androidx.compose.foundation.text.Handle
 import androidx.compose.foundation.text.selection.Selection
 import androidx.compose.foundation.text.selection.SelectionContainer
+import androidx.compose.foundation.text.selection.SelectionHandleInfoKey
 import androidx.compose.foundation.text.selection.fetchTextLayoutResult
 import androidx.compose.foundation.text.selection.gestures.util.SelectionSubject
 import androidx.compose.foundation.text.selection.gestures.util.TextSelectionAsserter
 import androidx.compose.foundation.text.selection.gestures.util.applyAndAssert
 import androidx.compose.foundation.text.selection.gestures.util.longPress
 import androidx.compose.foundation.text.selection.gestures.util.to
+import androidx.compose.foundation.text.selection.isSelectionHandle
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.SemanticsNodeInteraction
+import androidx.compose.ui.test.TouchInjectionScope
+import androidx.compose.ui.test.longClick
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performTouchInput
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
@@ -42,6 +50,8 @@
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth
+import kotlin.math.sign
+import kotlin.test.fail
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -172,14 +182,73 @@
         }
     }
 
-    private fun characterPosition(offset: Int): Offset {
+    // Test is irrelevant if the end handle is not hidden, which is the case below api 26.
+    @SdkSuppress(minSdkVersion = 26)
+    @Test
+    fun whenDragStartHandle_withNoEndHandle_selectionAndHandleUpdates() {
+        maxLinesState.value = 1
+        overflowState.value = TextOverflow.Clip
+        rule.waitForIdle()
+        asserter.assert()
+
+        performTouchGesture { longClick(characterPosition(4)) }
+        asserter.applyAndAssert {
+            selection = 0 to text.length
+            startSelectionHandleShown = true
+            textToolbarShown = true
+            hapticsCount++
+        }
+
+        withHandlePressed(Handle.SelectionStart) {
+            moveHandleToCharacter(characterOffset = 2)
+        }
+        asserter.applyAndAssert {
+            selection = 2 to text.length
+            hapticsCount++
+        }
+    }
+
+    private fun withHandlePressed(
+        handle: Handle,
+        block: SemanticsNodeInteraction.() -> Unit
+    ): SemanticsNodeInteraction = rule.onNode(isSelectionHandle(handle)).run {
+        performTouchInput { down(center) }
+        block()
+        performTouchInput { up() }
+    }
+
+    private fun SemanticsNodeInteraction.moveHandleToCharacter(characterOffset: Int) {
+        val selectionHandleInfo = fetchSemanticsNode().config[SelectionHandleInfoKey]
+        val destinationPosition = characterBox(characterOffset).run {
+            when (selectionHandleInfo.handle) {
+                Handle.SelectionStart -> bottomLeft
+                Handle.SelectionEnd -> bottomRight
+                Handle.Cursor -> fail("Unexpected handle ${Handle.Cursor}")
+            }
+        }
+        val delta = destinationPosition - selectionHandleInfo.position
+        performTouchInput { movePastSlopBy(delta) }
+    }
+
+    private fun TouchInjectionScope.movePastSlopBy(delta: Offset) {
+        val slop = Offset(
+            x = viewConfiguration.touchSlop * delta.x.sign,
+            y = viewConfiguration.touchSlop * delta.y.sign
+        )
+        moveBy(delta + slop)
+    }
+
+    private fun characterPosition(offset: Int): Offset =
+        characterBox(offset)
+            .centerLeft
+            .nudge(HorizontalDirection.END)
+
+    private fun characterBox(offset: Int): Rect {
         val pointerAreaPosition =
             rule.onNodeWithTag(pointerAreaTag).fetchSemanticsNode().positionInRoot
         val textPosition = rule.onNodeWithTag(textTag).fetchSemanticsNode().positionInRoot
         val textLayoutResult = rule.onNodeWithTag(textTag).fetchTextLayoutResult()
         return textLayoutResult.getBoundingBox(offset)
             .translate(textPosition - pointerAreaPosition)
-            .centerLeft
-            .nudge(HorizontalDirection.END)
     }
 }
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/BasicSecureTextFieldTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/BasicSecureTextFieldTest.kt
index 485190f..6cadee0 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/BasicSecureTextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/BasicSecureTextFieldTest.kt
@@ -353,7 +353,6 @@
         }
     }
 
-    @OptIn(ExperimentalTestApi::class)
     @Test
     fun toolbarDoesNotShowCopyOrCut() {
         var copyOptionAvailable = false
@@ -378,7 +377,10 @@
         }
 
         rule.onNodeWithTag(Tag).requestFocus()
-        rule.onNodeWithTag(Tag).performTextInputSelection(TextRange(0, 5))
+        // We need to disable the traversalMode to show the toolbar.
+        rule.onNodeWithTag(Tag).performSemanticsAction(SemanticsActions.SetSelection) {
+            it(0, 5, false)
+        }
 
         rule.runOnIdle {
             assertThat(showMenuRequested).isTrue()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/InputMethodInterceptor.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/InputMethodInterceptor.kt
index 74106a0..4b95f5a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/InputMethodInterceptor.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/InputMethodInterceptor.kt
@@ -22,11 +22,11 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.platform.PlatformTextInputMethodRequest
 import androidx.compose.ui.platform.PlatformTextInputSession
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.PlatformTextInputMethodTestOverride
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
 import com.google.common.truth.Truth.assertWithMessage
 import kotlinx.coroutines.awaitCancellation
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldCursorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldCursorTest.kt
index 16f3650..85c4f9a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldCursorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldCursorTest.kt
@@ -733,6 +733,14 @@
             }
         }
 
+        focusAndWait()
+
+        // cursor visible first 500ms
+        rule.mainClock.advanceTimeBy(100)
+        rule.onNode(hasSetTextAction())
+            .captureToImage()
+            .assertContainsColor(cursorColor)
+
         // window loses focus
         focusWindow.value = false
         rule.waitForIdle()
@@ -776,12 +784,11 @@
 
         // check that text field cursor disappeared even within visible 500ms
         rule.mainClock.advanceTimeBy(100)
-
         rule.onNode(hasSetTextAction())
             .captureToImage()
             .assertDoesNotContainColor(cursorColor)
 
-        // window regains focus
+        // window regains focus within 500ms
         focusWindow.value = true
         rule.waitForIdle()
 
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldFocusTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldFocusTest.kt
index 453aa32..e9bdba6c 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldFocusTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldFocusTest.kt
@@ -41,11 +41,11 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.Dialog
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
-import org.junit.AssumptionViolatedException
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -253,7 +253,7 @@
         rule.waitForIdle()
 
         // Move focus to the focusable element on left
-        keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_LEFT)
+        if (!keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_LEFT)) return
 
         // Check if the element to the left of text field gains focus
         rule.onNodeWithTag("test-button-left").assertIsFocused()
@@ -270,7 +270,7 @@
         rule.waitForIdle()
 
         // Move focus to the focusable element on right
-        keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_RIGHT)
+        if (!keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_RIGHT)) return
 
         // Check if the element to the right of text field gains focus
         rule.onNodeWithTag("test-button-right").assertIsFocused()
@@ -287,7 +287,7 @@
         rule.waitForIdle()
 
         // Move focus to the focusable element on top
-        keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_UP)
+        if (!keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_UP)) return
 
         // Check if the element on the top of text field gains focus
         rule.onNodeWithTag("test-button-top").assertIsFocused()
@@ -304,12 +304,13 @@
         rule.waitForIdle()
 
         // Move focus to the focusable element on bottom
-        keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_DOWN)
+        if (!keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_DOWN)) return
 
         // Check if the element to the bottom of text field gains focus
         rule.onNodeWithTag("test-button-bottom").assertIsFocused()
     }
 
+    @FlakyTest(bugId = 305087008)
     @Test
     fun basicTextField_checkKeyboardShown_onDPadCenter() {
         setupAndEnableBasicTextField()
@@ -320,7 +321,7 @@
         testKeyboardController.assertHidden()
 
         // Check if keyboard is enabled on Dpad center key press
-        keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_CENTER)
+        if (!keyPressOnDpadInputDevice(rule, NativeKeyEvent.KEYCODE_DPAD_CENTER)) return
         testKeyboardController.assertShown()
     }
 
@@ -462,19 +463,11 @@
         source: Int,
         count: Int = 1,
         metaState: Int = 0,
-    ) {
-        // Since we can't create our own InputDevices, we have to use one that is connected to the
-        // system. This functionality only supports specific types of input devices, so we have to
-        // filter and if we can't find a valid one, the test can't run. In that case, we throw
-        // an AssumptionViolatedException which will abort the test and cause JUnit to report it
-        // as ignored.
+    ): Boolean {
         val deviceId = InputDevice.getDeviceIds().firstOrNull { id ->
             InputDevice.getDevice(id)?.isVirtual?.not() ?: false &&
                 InputDevice.getDevice(id)?.supportsSource(source) ?: false
-        } ?: throw AssumptionViolatedException(
-            "Could not find physical input device to send DPAD event from"
-        )
-
+        } ?: return false
         val keyEventDown = KeyEvent(
             SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
             KeyEvent.ACTION_DOWN, keyCode, 0, metaState,
@@ -491,6 +484,7 @@
             rule.waitForIdle()
             rule.onRoot().performKeyPress(androidx.compose.ui.input.key.KeyEvent(keyEventUp))
         }
+        return true
     }
 
     /** Triggers a key press on the virtual keyboard. */
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldSingleLineHeightTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldSingleLineHeightTest.kt
new file mode 100644
index 0000000..0315b03
--- /dev/null
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldSingleLineHeightTest.kt
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.text2
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.text.FocusedWindowTest
+import androidx.compose.foundation.text.Handle
+import androidx.compose.foundation.text.selection.isSelectionHandle
+import androidx.compose.foundation.text2.input.TextFieldLineLimits
+import androidx.compose.foundation.text2.input.TextFieldState
+import androidx.compose.foundation.text2.input.setTextAndPlaceCursorAtEnd
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.onSizeChanged
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.unit.IntSize
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalFoundationApi::class)
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class TextFieldSingleLineHeightTest : FocusedWindowTest {
+
+    private val TextfieldTag = "textField"
+
+    private val defaultText = "TEXT"
+
+    // Arabic and Thai characters combined for super tall script
+    private val tallText = "\u0627\u0644\u0646\u0635\u0E17\u0E35\u0E48"
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun singleLineTextField_fromEmptyToTallText_updatesHeight() {
+        val state = TextFieldState("")
+        var reportedSize: IntSize = IntSize.Zero
+        rule.setTextFieldTestContent {
+            BasicTextField2(
+                state = state,
+                lineLimits = TextFieldLineLimits.SingleLine,
+                modifier = Modifier.onSizeChanged {
+                    reportedSize = it
+                }
+            )
+        }
+
+        rule.waitForIdle()
+        val emptyHeight = reportedSize.height
+
+        state.setTextAndPlaceCursorAtEnd(tallText)
+
+        rule.waitForIdle()
+        val tallHeight = reportedSize.height
+
+        assertThat(emptyHeight).isLessThan(tallHeight)
+    }
+
+    @Test
+    fun singleLineTextField_fromLatinToTallText_updatesHeight() {
+        val state = TextFieldState(defaultText)
+        var reportedSize: IntSize = IntSize.Zero
+        rule.setTextFieldTestContent {
+            BasicTextField2(
+                state = state,
+                lineLimits = TextFieldLineLimits.SingleLine,
+                modifier = Modifier.onSizeChanged {
+                    reportedSize = it
+                }
+            )
+        }
+
+        rule.waitForIdle()
+        val latinHeight = reportedSize.height
+
+        state.setTextAndPlaceCursorAtEnd(tallText)
+
+        rule.waitForIdle()
+        val tallHeight = reportedSize.height
+
+        assertThat(latinHeight).isLessThan(tallHeight)
+    }
+
+    @Test
+    fun singleLineTextField_withTallText_showsCursorHandle_whenClicked() {
+        val state = TextFieldState(tallText)
+        rule.setTextFieldTestContent {
+            BasicTextField2(
+                state = state,
+                lineLimits = TextFieldLineLimits.SingleLine,
+                modifier = Modifier.testTag(TextfieldTag)
+            )
+        }
+
+        rule.onNodeWithTag(TextfieldTag).performClick()
+
+        rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
+    }
+
+    @Test
+    fun multiLineTextField_withTallText_showsCursorHandle_whenClicked() {
+        val state = TextFieldState(tallText)
+        rule.setTextFieldTestContent {
+            BasicTextField2(
+                state = state,
+                lineLimits = TextFieldLineLimits.MultiLine(1, 1),
+                modifier = Modifier.testTag(TextfieldTag)
+            )
+        }
+
+        rule.onNodeWithTag(TextfieldTag).performClick()
+
+        rule.onNode(isSelectionHandle(Handle.Cursor)).assertIsDisplayed()
+    }
+}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/AndroidTextInputSessionTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/AndroidTextInputSessionTest.kt
index 695ae0e..55f233a 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/AndroidTextInputSessionTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/AndroidTextInputSessionTest.kt
@@ -30,8 +30,8 @@
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.PlatformTextInputModifierNode
 import androidx.compose.ui.platform.PlatformTextInputSession
+import androidx.compose.ui.platform.runTextInputSession
 import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.platform.textInputSession
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.requestFocus
@@ -204,7 +204,7 @@
         onImeAction: (ImeAction) -> Unit = {}
     ) {
         coroutineScope.launch {
-            textInputNode.textInputSession {
+            textInputNode.runTextInputSession {
                 inputSessionWithDefaultsForTest(
                     state,
                     imeOptions,
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/selection/TextFieldTextToolbarTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/selection/TextFieldTextToolbarTest.kt
index 9025a62..c392fd1 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/selection/TextFieldTextToolbarTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/selection/TextFieldTextToolbarTest.kt
@@ -26,12 +26,14 @@
 import androidx.compose.foundation.text.Handle
 import androidx.compose.foundation.text.TEST_FONT_FAMILY
 import androidx.compose.foundation.text.selection.FakeTextToolbar
+import androidx.compose.foundation.text.selection.gestures.util.longPress
 import androidx.compose.foundation.text.selection.isSelectionHandle
 import androidx.compose.foundation.text2.BasicTextField2
 import androidx.compose.foundation.text2.input.InputTransformation
 import androidx.compose.foundation.text2.input.TextFieldLineLimits
 import androidx.compose.foundation.text2.input.TextFieldState
 import androidx.compose.foundation.text2.input.placeCursorAtEnd
+import androidx.compose.foundation.text2.input.selectAll
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -48,7 +50,9 @@
 import androidx.compose.ui.platform.TextToolbar
 import androidx.compose.ui.platform.TextToolbarStatus
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
 import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.SemanticsNodeInteraction
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.longClick
@@ -56,6 +60,7 @@
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.test.performKeyInput
 import androidx.compose.ui.test.performMouseInput
+import androidx.compose.ui.test.performSemanticsAction
 import androidx.compose.ui.test.performTextInput
 import androidx.compose.ui.test.performTextInputSelection
 import androidx.compose.ui.test.performTouchInput
@@ -63,6 +68,7 @@
 import androidx.compose.ui.test.requestFocus
 import androidx.compose.ui.test.swipeLeft
 import androidx.compose.ui.test.swipeRight
+import androidx.compose.ui.test.withKeyDown
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
@@ -78,7 +84,7 @@
 import org.junit.Rule
 import org.junit.Test
 
-@OptIn(ExperimentalFoundationApi::class)
+@OptIn(ExperimentalFoundationApi::class, ExperimentalTestApi::class)
 @LargeTest
 class TextFieldTextToolbarTest : FocusedWindowTest {
 
@@ -163,6 +169,98 @@
     }
 
     @Test
+    fun toolbarDoesNotAppear_ifSelectionIsInitiatedViaHardwareKeys() {
+        val textToolbar = FakeTextToolbar()
+        val state = TextFieldState("Hello")
+        setupContent(state, textToolbar)
+
+        with(rule.onNodeWithTag(TAG)) {
+            requestFocus()
+            performKeyInput {
+                withKeyDown(Key.ShiftLeft) {
+                    pressKey(Key.DirectionLeft)
+                    pressKey(Key.DirectionLeft)
+                    pressKey(Key.DirectionLeft)
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(state.text.selectionInChars).isEqualTo(TextRange(5, 2))
+            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
+        }
+
+        with(rule.onNodeWithTag(TAG)) {
+            performKeyInput {
+                withKeyDown(Key.CtrlLeft) {
+                    pressKey(Key.A)
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(state.text.selectionInChars).isEqualTo(TextRange(0, 5))
+            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
+        }
+    }
+
+    @Test
+    fun toolbarDoesNotAppear_ifSelectionIsInitiatedViaStateUpdate() {
+        val textToolbar = FakeTextToolbar()
+        val state = TextFieldState("Hello")
+        setupContent(state, textToolbar)
+
+        with(rule.onNodeWithTag(TAG)) {
+            requestFocus()
+        }
+
+        rule.runOnIdle {
+            state.edit { selectAll() }
+        }
+
+        rule.runOnIdle {
+            assertThat(state.text.selectionInChars).isEqualTo(TextRange(0, 5))
+            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
+        }
+    }
+
+    @Test
+    fun toolbarDoesNotAppear_ifSelectionIsInitiatedViaSemantics() {
+        val textToolbar = FakeTextToolbar()
+        val state = TextFieldState("Hello")
+        setupContent(state, textToolbar)
+
+        with(rule.onNodeWithTag(TAG)) {
+            requestFocus()
+            performTextInputSelection(TextRange(0, 5))
+        }
+
+        rule.runOnIdle {
+            assertThat(state.text.selectionInChars).isEqualTo(TextRange(0, 5))
+            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
+        }
+    }
+
+    @Test
+    fun toolbarAppears_ifSelectionIsInitiatedViaSemantics_inNoneTraversalMode() {
+        val textToolbar = FakeTextToolbar()
+        val state = TextFieldState("Hello")
+        setupContent(state, textToolbar)
+
+        with(rule.onNodeWithTag(TAG)) {
+            requestFocus()
+            performSemanticsAction(SemanticsActions.SetSelection) {
+                it(0, 5, false)
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(state.text.selectionInChars).isEqualTo(TextRange(0, 5))
+            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
+        }
+    }
+
+    @Test
     fun toolbarDisappears_whenTextIsEntered_throughIME() {
         val textToolbar = FakeTextToolbar()
         val state = TextFieldState("Hello")
@@ -206,7 +304,6 @@
         }
     }
 
-    @OptIn(ExperimentalTestApi::class)
     @Test
     fun selectionToolbarDisappears_whenTextField_getsDisabled_doesNotReappear() {
         val textToolbar = FakeTextToolbar()
@@ -214,7 +311,7 @@
         setupContent(state, textToolbar)
 
         rule.onNodeWithTag(TAG).requestFocus()
-        rule.onNodeWithTag(TAG).performTextInputSelection(TextRange(2, 4))
+        rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(2, 4))
         rule.runOnIdle {
             assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
         }
@@ -487,7 +584,6 @@
         }
     }
 
-    @OptIn(ExperimentalTestApi::class)
     @Test
     fun toolbarShowsCopyAndCut_whenSelectionIsExpanded() {
         var cutOptionAvailable = false
@@ -503,7 +599,7 @@
         setupContent(state, textToolbar, true)
 
         rule.onNodeWithTag(TAG).requestFocus()
-        rule.onNodeWithTag(TAG).performTextInputSelection(TextRange(2, 4))
+        rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(2, 4))
 
         rule.runOnIdle {
             assertThat(copyOptionAvailable).isTrue()
@@ -511,7 +607,6 @@
         }
     }
 
-    @OptIn(ExperimentalTestApi::class)
     @Test
     fun copyUpdatesClipboardManager_placesCursorAtTheEndOfSelectedRegion() {
         var copyOption: (() -> Unit)? = null
@@ -526,7 +621,7 @@
         setupContent(state, textToolbar, true, clipboardManager)
 
         rule.onNodeWithTag(TAG).requestFocus()
-        rule.onNodeWithTag(TAG).performTextInputSelection(TextRange(0, 5))
+        rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(0, 5))
 
         rule.runOnIdle {
             copyOption!!.invoke()
@@ -538,7 +633,6 @@
         }
     }
 
-    @OptIn(ExperimentalTestApi::class)
     @Test
     fun cutUpdatesClipboardManager_placesCursorAtTheEndOfSelectedRegion_removesTheCutContent() {
         var cutOption: (() -> Unit)? = null
@@ -553,7 +647,7 @@
         setupContent(state, textToolbar, true, clipboardManager)
 
         rule.onNodeWithTag(TAG).requestFocus()
-        rule.onNodeWithTag(TAG).performTextInputSelection(TextRange(1, 5))
+        rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(1, 5))
 
         rule.runOnIdle {
             cutOption!!.invoke()
@@ -566,7 +660,6 @@
         }
     }
 
-    @OptIn(ExperimentalTestApi::class)
     @Test
     fun cutAppliesFilter() {
         var cutOption: (() -> Unit)? = null
@@ -586,7 +679,7 @@
         }
 
         rule.onNodeWithTag(TAG).requestFocus()
-        rule.onNodeWithTag(TAG).performTextInputSelection(TextRange(1, 5))
+        rule.onNodeWithTag(TAG).performTextInputSelectionShowingToolbar(TextRange(1, 5))
 
         rule.runOnIdle {
             cutOption!!.invoke()
@@ -712,6 +805,27 @@
         }
     }
 
+    @Test
+    fun toolbarDisappears_whenLongPressIsInitiated() {
+        val textToolbar = FakeTextToolbar()
+        val state = TextFieldState("Hello")
+        setupContent(state, textToolbar)
+
+        rule.onNodeWithTag(TAG).performTouchInput { click(Offset(fontSizePx * 2, fontSizePx / 2)) }
+        rule.onNode(isSelectionHandle(Handle.Cursor)).performClick()
+        rule.runOnIdle {
+            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Shown)
+        }
+
+        rule.onNodeWithTag(TAG).performTouchInput {
+            longPress(Offset(3 * fontSizePx * 2, fontSizePx / 2))
+        }
+
+        rule.runOnIdle {
+            assertThat(textToolbar.status).isEqualTo(TextToolbarStatus.Hidden)
+        }
+    }
+
     private fun setupContent(
         state: TextFieldState = TextFieldState(),
         toolbar: TextToolbar = FakeTextToolbar(),
@@ -785,3 +899,15 @@
         return currentText
     }
 }
+
+/**
+ * Toolbar does not show up when text is selected with traversal mode off (relative to original
+ * text). This is an override of [SemanticsNodeInteraction.performTextInputSelection] that
+ * makes sure the toolbar shows up after selection is initiated.
+ */
+fun SemanticsNodeInteraction.performTextInputSelectionShowingToolbar(selection: TextRange) {
+    requestFocus()
+    performSemanticsAction(SemanticsActions.SetSelection) {
+        it(selection.min, selection.max, false)
+    }
+}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/undo/BasicTextField2UndoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/undo/BasicTextField2UndoTest.kt
index c5ee6a8..0605dde 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/undo/BasicTextField2UndoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/undo/BasicTextField2UndoTest.kt
@@ -38,6 +38,7 @@
 import androidx.compose.ui.test.requestFocus
 import androidx.compose.ui.text.TextRange
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
@@ -246,6 +247,7 @@
         assertThat(state.undoState.canUndo).isFalse()
     }
 
+    @FlakyTest(bugId = 305090138)
     @Test
     fun clearHistory_removesAllUndoAndRedo() {
         val state = TextFieldState()
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
index 249f1a4..38a96aa 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
@@ -28,6 +28,8 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
+import androidx.compose.testutils.assertContainsColor
+import androidx.compose.testutils.assertDoesNotContainColor
 import androidx.compose.testutils.assertPixelColor
 import androidx.compose.testutils.assertPixels
 import androidx.compose.testutils.assertShape
@@ -600,11 +602,9 @@
 
         // cursor visible first 500ms
         rule.mainClock.advanceTimeBy(100)
-        with(rule.density) {
-            rule.onNode(hasSetTextAction())
-                .captureToImage()
-                .assertCursor(2.dp, this, cursorRect)
-        }
+        rule.onNode(hasSetTextAction())
+            .captureToImage()
+            .assertContainsColor(cursorColor)
 
         // window loses focus
         focusWindow.value = false
@@ -614,13 +614,7 @@
         rule.mainClock.advanceTimeBy(100)
         rule.onNode(hasSetTextAction())
             .captureToImage()
-            .assertShape(
-                density = rule.density,
-                shape = RectangleShape,
-                shapeColor = Color.White,
-                backgroundColor = Color.White,
-                shapeOverlapPixelCount = 0.0f
-            )
+            .assertDoesNotContainColor(cursorColor)
     }
 
     @Test
@@ -656,24 +650,17 @@
         rule.mainClock.advanceTimeBy(100)
         rule.onNode(hasSetTextAction())
             .captureToImage()
-            .assertShape(
-                density = rule.density,
-                shape = RectangleShape,
-                shapeColor = Color.White,
-                backgroundColor = Color.White,
-                shapeOverlapPixelCount = 0.0f
-            )
+            .assertDoesNotContainColor(cursorColor)
 
         // window regains focus within 500ms
         focusWindow.value = true
         rule.waitForIdle()
 
         rule.mainClock.advanceTimeBy(100)
-        with(rule.density) {
-            rule.onNode(hasSetTextAction())
-                .captureToImage()
-                .assertCursor(2.dp, this, cursorRect)
-        }
+        rule.onNode(hasSetTextAction())
+            .captureToImage()
+            .assertContainsColor(cursorColor)
+            .assertCursor(2.dp, rule.density, cursorRect)
     }
 
     private fun focusAndWait() {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
index 0f6574d..51379d4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
@@ -17,7 +17,6 @@
 package androidx.compose.foundation.textfield
 
 import android.os.Build
-import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.interaction.FocusInteraction
@@ -40,9 +39,11 @@
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.foundation.text.BasicTextField
 import androidx.compose.foundation.text.FocusedWindowTest
+import androidx.compose.foundation.text.Handle
 import androidx.compose.foundation.text.KeyboardActions
 import androidx.compose.foundation.text.KeyboardOptions
 import androidx.compose.foundation.text.computeSizeForDefaultText
+import androidx.compose.foundation.text.selection.isSelectionHandle
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.MutableState
@@ -54,6 +55,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.testutils.assertPixelColor
 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.focus.onFocusChanged
@@ -166,7 +168,6 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-@OptIn(ExperimentalFoundationApi::class)
 class TextFieldTest : FocusedWindowTest {
     @get:Rule
     val rule = createComposeRule()
@@ -1300,6 +1301,29 @@
         rule.onNodeWithTag(Tag).captureToImage().assertCentered(fontSize)
     }
 
+    @Test
+    fun textField_cursorAppearsOnTouch_thenDisappearsWhenTyping() {
+        rule.setTextFieldTestContent {
+            Box(Modifier.fillMaxSize(), Alignment.Center) {
+                BasicTextField(
+                    value = "test",
+                    onValueChange = {},
+                    // center so that the click places the cursor in the middle of the word
+                    textStyle = TextStyle(textAlign = TextAlign.Center),
+                    modifier = Modifier.testTag(Tag),
+                )
+            }
+        }
+
+        rule.onNode(isSelectionHandle(Handle.Cursor)).assertDoesNotExist()
+
+        rule.onNodeWithTag(Tag).performTouchInput { click() }
+        rule.onNode(isSelectionHandle(Handle.Cursor)).assertExists()
+
+        rule.onNodeWithTag(Tag).performTextInput("t")
+        rule.onNode(isSelectionHandle(Handle.Cursor)).assertDoesNotExist()
+    }
+
     @OptIn(ExperimentalTestApi::class)
     @Test
     fun whenSelectedTextIsRemoved_SelectionCoerces() {
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionFakes.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionFakes.kt
index df963b9..cb6b577 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionFakes.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionFakes.kt
@@ -113,6 +113,8 @@
     }
 
     val multiParagraph = mock<MultiParagraph> {
+        on { lineCount }.thenAnswer { _ -> lineBreaks.size + 1 }
+
         on { getBidiRunDirection(any()) }.thenAnswer { invocation ->
             val offset = invocation.arguments[0] as Int
             if (rtlCharRanges.any { offset in it })
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutStartSlot2DTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutStartSlot2DTest.kt
index 619627d..c75e124 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutStartSlot2DTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutStartSlot2DTest.kt
@@ -83,8 +83,7 @@
     /** Calls [getTextFieldSelectionLayout] to get a [SelectionLayout]. */
     @OptIn(ExperimentalContracts::class)
     internal fun buildSelectionLayoutForTest(
-        startHandlePosition: Offset = Offset(5f, 5f),
-        endHandlePosition: Offset = Offset(25f, 5f),
+        currentPosition: Offset = Offset(25f, 5f),
         previousHandlePosition: Offset = Offset.Unspecified,
         containerCoordinates: LayoutCoordinates = MockCoordinates(),
         isStartHandle: Boolean = false,
@@ -94,8 +93,7 @@
     ): SelectionLayout {
         contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
         return SelectionLayoutBuilder(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            currentPosition = currentPosition,
             previousHandlePosition = previousHandlePosition,
             containerCoordinates = containerCoordinates,
             isStartHandle = isStartHandle,
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutTest.kt
index 3cba9f6..88ad2d4 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionLayoutTest.kt
@@ -1519,8 +1519,7 @@
     /** Calls [getTextFieldSelectionLayout] to get a [SelectionLayout]. */
     @OptIn(ExperimentalContracts::class)
     private fun buildSelectionLayoutForTest(
-        startHandlePosition: Offset = Offset(5f, 5f),
-        endHandlePosition: Offset = Offset(25f, 5f),
+        currentPosition: Offset = Offset(25f, 5f),
         previousHandlePosition: Offset = Offset.Unspecified,
         containerCoordinates: LayoutCoordinates = MockCoordinates(),
         isStartHandle: Boolean = false,
@@ -1530,8 +1529,7 @@
     ): SelectionLayout {
         contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
         return SelectionLayoutBuilder(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            currentPosition = currentPosition,
             previousHandlePosition = previousHandlePosition,
             containerCoordinates = containerCoordinates,
             isStartHandle = isStartHandle,
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
index 295f7af..a44824d 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
@@ -105,7 +105,6 @@
 
     @Test
     fun updateSelection_onInitial_returnsTrue() {
-        val startHandlePosition = Offset(x = 5f, y = 5f)
         val endHandlePosition = Offset(x = 25f, y = 5f)
         selectable.apply {
             textToReturn = AnnotatedString("hello")
@@ -114,8 +113,7 @@
         }
 
         val actual = selectionManager.updateSelection(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            position = endHandlePosition,
             previousHandlePosition = endHandlePosition - Offset(x = 5f, y = 0f),
             isStartHandle = false,
             adjustment = SelectionAdjustment.None,
@@ -127,7 +125,6 @@
 
     @Test
     fun updateSelection_onNoChange_returnsFalse() {
-        val startHandlePosition = Offset(x = 5f, y = 5f)
         val endHandlePosition = Offset(x = 25f, y = 5f)
         selectable.apply {
             textToReturn = AnnotatedString("hello")
@@ -138,8 +135,7 @@
 
         // run once to set context for the "previous" selection update
         selectionManager.updateSelection(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            position = endHandlePosition,
             previousHandlePosition = endHandlePosition,
             isStartHandle = false,
             adjustment = SelectionAdjustment.None,
@@ -147,8 +143,7 @@
 
         // run again since we are testing the "no changes" case
         val actual = selectionManager.updateSelection(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            position = endHandlePosition,
             previousHandlePosition = endHandlePosition,
             isStartHandle = false,
             adjustment = SelectionAdjustment.None,
@@ -160,7 +155,6 @@
 
     @Test
     fun updateSelection_onChange_returnsTrue() {
-        val startHandlePosition = Offset(x = 5f, y = 5f)
         val endHandlePosition = Offset(x = 25f, y = 5f)
         selectable.apply {
             textToReturn = AnnotatedString("hello")
@@ -171,8 +165,7 @@
 
         // run once to set context for the "previous" selection update
         selectionManager.updateSelection(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            position = endHandlePosition,
             previousHandlePosition = endHandlePosition,
             isStartHandle = false,
             adjustment = SelectionAdjustment.None,
@@ -181,8 +174,7 @@
         // run again with a change in end handle
         selectable.rawEndHandleOffset = 4
         val actual = selectionManager.updateSelection(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            position = endHandlePosition,
             previousHandlePosition = endHandlePosition - Offset(x = 5f, y = 0f),
             isStartHandle = false,
             adjustment = SelectionAdjustment.None,
diff --git a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManagerTest.kt b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManagerTest.kt
index d300920..8a9749d 100644
--- a/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManagerTest.kt
+++ b/compose/foundation/foundation/src/androidUnitTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManagerTest.kt
@@ -180,7 +180,7 @@
         manager.touchSelectionObserver.onStart(dragBeginPosition)
 
         // Assert
-        assertThat(state.handleState).isEqualTo(HandleState.Selection)
+        assertThat(state.handleState).isEqualTo(HandleState.Cursor)
         assertThat(state.showFloatingToolbar).isFalse()
         assertThat(value.selection).isEqualTo(TextRange(fakeLineEnd))
         verify(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/AnchoredDraggable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/AnchoredDraggable.kt
index d7696e1..8b3c9c4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/AnchoredDraggable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/AnchoredDraggable.kt
@@ -446,33 +446,23 @@
         val velocityThresholdPx = velocityThreshold()
         return if (currentAnchorPosition == offset || currentAnchorPosition.isNaN()) {
             currentValue
-        } else if (currentAnchorPosition < offset) {
-            // Swiping from lower to upper (positive).
-            if (velocity >= velocityThresholdPx) {
-                currentAnchors.closestAnchor(offset, true)!!
-            } else {
-                val upper = currentAnchors.closestAnchor(offset, true)!!
-                val distance = abs(currentAnchors.positionOf(upper) - currentAnchorPosition)
-                val relativeThreshold = abs(positionalThreshold(distance))
-                val absoluteThreshold = abs(currentAnchorPosition + relativeThreshold)
-                if (offset < absoluteThreshold) currentValue else upper
-            }
         } else {
-            // Swiping from upper to lower (negative).
-            if (velocity <= -velocityThresholdPx) {
-                currentAnchors.closestAnchor(offset, false)!!
+            if (abs(velocity) >= abs(velocityThresholdPx)) {
+                currentAnchors.closestAnchor(
+                    offset,
+                    offset - currentAnchorPosition > 0
+                )!!
             } else {
-                val lower = currentAnchors.closestAnchor(offset, false)!!
-                val distance = abs(currentAnchorPosition - currentAnchors.positionOf(lower))
+                val neighborAnchor =
+                    currentAnchors.closestAnchor(
+                        offset,
+                        offset - currentAnchorPosition > 0
+                    )!!
+                val neighborAnchorPosition = currentAnchors.positionOf(neighborAnchor)
+                val distance = abs(currentAnchorPosition - neighborAnchorPosition)
                 val relativeThreshold = abs(positionalThreshold(distance))
-                val absoluteThreshold = abs(currentAnchorPosition - relativeThreshold)
-                if (offset < 0) {
-                    // For negative offsets, larger absolute thresholds are closer to lower anchors
-                    // than smaller ones.
-                    if (abs(offset) < absoluteThreshold) currentValue else lower
-                } else {
-                    if (offset > absoluteThreshold) currentValue else lower
-                }
+                val relativePosition = abs(currentAnchorPosition - offset)
+                if (relativePosition <= relativeThreshold) currentValue else neighborAnchor
             }
         }
     }
@@ -485,10 +475,11 @@
         val currentAnchor = currentAnchors.positionOf(currentValue)
         return if (currentAnchor == offset || currentAnchor.isNaN()) {
             currentValue
-        } else if (currentAnchor < offset) {
-            currentAnchors.closestAnchor(offset, true) ?: currentValue
         } else {
-            currentAnchors.closestAnchor(offset, false) ?: currentValue
+            currentAnchors.closestAnchor(
+                offset,
+                offset - currentAnchor > 0
+            ) ?: currentValue
         }
     }
 
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 53c5297..c9389b5 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
@@ -716,13 +716,17 @@
 
                 SelectionToolbarAndHandles(
                     manager = manager,
-                    show = state.handleState == HandleState.Selection &&
+                    show = state.handleState != HandleState.None &&
                         state.layoutCoordinates != null &&
                         state.layoutCoordinates!!.isAttached &&
                         showHandleAndMagnifier
                 )
 
-                if (!readOnly && showHandleAndMagnifier) {
+                if (
+                    state.handleState == HandleState.Cursor &&
+                    !readOnly &&
+                    showHandleAndMagnifier
+                ) {
                     TextFieldCursorHandle(manager = manager)
                 }
             }
@@ -880,6 +884,11 @@
 
     /**
      * A flag to check if the floating toolbar should show.
+     *
+     * This state is meant to represent the floating toolbar status regardless of if all touch
+     * behaviors are disabled (like if the user is using a mouse). This is so that when touch
+     * behaviors are re-enabled, the toolbar status will still reflect whether it should be shown
+     * at that point.
      */
     var showFloatingToolbar by mutableStateOf(false)
 
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 142a3fce..c1f1066 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
@@ -96,7 +96,7 @@
     observer: TextDragObserver
 ) {
     awaitEachGesture {
-        val down = awaitFirstDown()
+        val down = awaitFirstDown(requireUnconsumed = false)
         observer.onDown(down.position)
         // Wait for that pointer to come up.
         do {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
index 94ec4e7..78a3254 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
@@ -74,8 +74,7 @@
 
         val relativePosition =
             builder.containerCoordinates.localPositionOf(layoutCoordinates, Offset.Zero)
-        val localStartPosition = builder.startHandlePosition - relativePosition
-        val localEndPosition = builder.endHandlePosition - relativePosition
+        val localPosition = builder.currentPosition - relativePosition
         val localPreviousHandlePosition = if (builder.previousHandlePosition.isUnspecified) {
             Offset.Unspecified
         } else {
@@ -84,8 +83,7 @@
 
         builder.appendSelectableInfo(
             textLayoutResult = textLayoutResult,
-            startPosition = localStartPosition,
-            endPosition = localEndPosition,
+            localPosition = localPosition,
             previousHandlePosition = localPreviousHandlePosition,
             selectableId = selectableId,
         )
@@ -196,17 +194,14 @@
  * Appends a [SelectableInfo] to this [SelectionLayoutBuilder].
  *
  * @param textLayoutResult the [TextLayoutResult] for the selectable
- * @param startPosition the position of the start handle if not being draggedor the drag position if
- *                      it is
- * @param endPosition  the position of the end handle if not being dragged or the drag position if
- *                     it is
+ * @param localPosition the position of the current handle if not being dragged
+ * or the drag position if it is
  * @param previousHandlePosition the position of the previous handle
  * @param selectableId the selectableId for the selectable
  */
 internal fun SelectionLayoutBuilder.appendSelectableInfo(
     textLayoutResult: TextLayoutResult,
-    startPosition: Offset,
-    endPosition: Offset,
+    localPosition: Offset,
     previousHandlePosition: Offset,
     selectableId: Long,
 ) {
@@ -217,10 +212,33 @@
         textLayoutResult.size.height.toFloat()
     )
 
-    val isSelected =
-        SelectionMode.Vertical.isSelected(bounds, startPosition, endPosition)
+    val currentXDirection = getXDirection(localPosition, bounds)
+    val currentYDirection = getYDirection(localPosition, bounds)
 
-    if (!isSelected) {
+    fun otherDirection(anchor: Selection.AnchorInfo?): Direction = anchor
+        ?.let { getDirectionById(it.selectableId, selectableId) }
+        ?: resolve2dDirection(currentXDirection, currentYDirection)
+
+    val otherDirection: Direction
+    val startXHandleDirection: Direction
+    val startYHandleDirection: Direction
+    val endXHandleDirection: Direction
+    val endYHandleDirection: Direction
+    if (isStartHandle) {
+        otherDirection = otherDirection(previousSelection?.end)
+        startXHandleDirection = currentXDirection
+        startYHandleDirection = currentYDirection
+        endXHandleDirection = otherDirection
+        endYHandleDirection = otherDirection
+    } else {
+        otherDirection = otherDirection(previousSelection?.start)
+        startXHandleDirection = otherDirection
+        startYHandleDirection = otherDirection
+        endXHandleDirection = currentXDirection
+        endYHandleDirection = currentYDirection
+    }
+
+    if (!isSelected(resolve2dDirection(currentXDirection, currentYDirection), otherDirection)) {
         return
     }
 
@@ -228,27 +246,21 @@
     val rawStartHandleOffset: Int
     val rawEndHandleOffset: Int
     if (isStartHandle) {
-        rawStartHandleOffset = getOffsetForPosition(startPosition, textLayoutResult)
+        rawStartHandleOffset = getOffsetForPosition(localPosition, textLayoutResult)
         rawEndHandleOffset = previousSelection?.end
             ?.getPreviousAdjustedOffset(selectableIdOrderingComparator, selectableId, textLength)
-            ?: getOffsetForPosition(endPosition, textLayoutResult)
+            ?: rawStartHandleOffset
     } else {
+        rawEndHandleOffset = getOffsetForPosition(localPosition, textLayoutResult)
         rawStartHandleOffset = previousSelection?.start
             ?.getPreviousAdjustedOffset(selectableIdOrderingComparator, selectableId, textLength)
-            ?: getOffsetForPosition(startPosition, textLayoutResult)
-        rawEndHandleOffset = getOffsetForPosition(endPosition, textLayoutResult)
+            ?: rawEndHandleOffset
     }
 
     val rawPreviousHandleOffset = if (previousHandlePosition.isUnspecified) -1 else {
         getOffsetForPosition(previousHandlePosition, textLayoutResult)
     }
 
-    val startXHandleDirection = getXDirection(startPosition, bounds)
-    val endXHandleDirection = getXDirection(endPosition, bounds)
-
-    val startYHandleDirection = getYDirection(startPosition, bounds)
-    val endYHandleDirection = getYDirection(endPosition, bounds)
-
     appendInfo(
         selectableId = selectableId,
         rawStartHandleOffset = rawStartHandleOffset,
@@ -291,6 +303,29 @@
     else -> Direction.ON
 }
 
+private fun SelectionLayoutBuilder.getDirectionById(
+    anchorSelectableId: Long,
+    currentSelectableId: Long,
+): Direction {
+    val compareResult = selectableIdOrderingComparator.compare(
+        anchorSelectableId,
+        currentSelectableId
+    )
+
+    return when {
+        compareResult < 0 -> Direction.BEFORE
+        compareResult > 0 -> Direction.AFTER
+        else -> Direction.ON
+    }
+}
+
+/**
+ * Returns true if either of the directions are [Direction.ON]
+ * or if the directions are on opposite sides.
+ */
+private fun isSelected(currentDirection: Direction, otherDirection: Direction): Boolean =
+    currentDirection == Direction.ON || currentDirection != otherDirection
+
 // map offsets above/below the text to 0/length respectively
 private fun getOffsetForPosition(position: Offset, textLayoutResult: TextLayoutResult): Int = when {
     position.y <= 0f -> 0
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
index e4c9a4e..bb040cd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionAdjustment.kt
@@ -252,8 +252,9 @@
         wordBoundary.start
     } else if (currentLine >= textLayoutResult.lineCount) {
         // We cannot find the line start, because this line is not even visible.
-        // Since we cannot really select meaningfully in this area, just use the word boundary.
-        wordBoundary.start
+        // Since we cannot really select meaningfully in this area,
+        // just use the start of the last visible line.
+        textLayoutResult.getLineStart(textLayoutResult.lineCount - 1)
     } else {
         textLayoutResult.getLineStart(currentLine)
     }
@@ -263,8 +264,9 @@
         wordBoundary.end
     } else if (currentLine >= textLayoutResult.lineCount) {
         // We cannot find the line end, because this line is not even visible.
-        // Since we cannot really select meaningfully in this area, just use the word boundary.
-        wordBoundary.end
+        // Since we cannot really select meaningfully in this area,
+        // just use the end of the last visible line.
+        textLayoutResult.getLineEnd(textLayoutResult.lineCount - 1)
     } else {
         textLayoutResult.getLineEnd(currentLine)
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionLayout.kt
index 424134d..948d11b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionLayout.kt
@@ -16,6 +16,9 @@
 
 package androidx.compose.foundation.text.selection
 
+import androidx.compose.foundation.text.selection.Direction.AFTER
+import androidx.compose.foundation.text.selection.Direction.BEFORE
+import androidx.compose.foundation.text.selection.Direction.ON
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.text.TextLayoutResult
@@ -300,6 +303,8 @@
  */
 private class SingleSelectionLayout(
     override val isStartHandle: Boolean,
+    override val startSlot: Int,
+    override val endSlot: Int,
     override val previousSelection: Selection?,
     private val info: SelectableInfo,
 ) : SelectionLayout {
@@ -309,8 +314,6 @@
     }
 
     override val size get() = 1
-    override val startSlot get() = info.slot
-    override val endSlot get() = info.slot
     override val crossStatus: CrossStatus get() = info.rawCrossStatus
     override val startInfo: SelectableInfo get() = info
     override val endInfo: SelectableInfo get() = info
@@ -367,6 +370,8 @@
     isStartHandle: Boolean,
 ): SelectionLayout = SingleSelectionLayout(
     isStartHandle = isStartHandle,
+    startSlot = SingleSelectionLayout.DEFAULT_SLOT,
+    endSlot = SingleSelectionLayout.DEFAULT_SLOT,
     previousSelection = if (isStartOfSelection) null else Selection(
         start = Selection.AnchorInfo(
             layoutResult.getTextDirectionForOffset(previousSelectionRange.start),
@@ -419,8 +424,7 @@
  * @param selectableIdOrderingComparator determines the ordering of selectables by their IDs
  */
 internal class SelectionLayoutBuilder(
-    val startHandlePosition: Offset,
-    val endHandlePosition: Offset,
+    val currentPosition: Offset,
     val previousHandlePosition: Offset,
     val containerCoordinates: LayoutCoordinates,
     val isStartHandle: Boolean,
@@ -439,19 +443,23 @@
      * @return the [SelectionLayout] or null if no [SelectableInfo]s were added.
      */
     fun build(): SelectionLayout {
+        val lastSlot = currentSlot + 1
         return when (infoList.size) {
-            0 -> throw IllegalStateException(
-                "SelectionLayout must have at least one SelectableInfo."
-            )
+            0 -> {
+                throw IllegalStateException("SelectionLayout must not be empty.")
+            }
 
-            1 -> SingleSelectionLayout(
-                info = infoList.single(),
-                previousSelection = previousSelection,
-                isStartHandle = isStartHandle,
-            )
+            1 -> {
+                SingleSelectionLayout(
+                    info = infoList.single(),
+                    startSlot = if (startSlot == UNASSIGNED_SLOT) lastSlot else startSlot,
+                    endSlot = if (endSlot == UNASSIGNED_SLOT) lastSlot else endSlot,
+                    previousSelection = previousSelection,
+                    isStartHandle = isStartHandle,
+                )
+            }
 
             else -> {
-                val lastSlot = currentSlot + 1
                 MultiSelectionLayout(
                     selectableIdToInfoListIndex = selectableIdToInfoListIndex,
                     infoList = infoList,
@@ -524,29 +532,17 @@
 
         // slot has not been determined yet,
         // see if we are on or past the selectable we are looking for
-        return when (yPositionDirection) {
-            // If we get here, that means we never found a selectable that intersects our gesture
-            // position on the y-axis. This is the first selectable that is after the position,
+        return when (resolve2dDirection(xPositionDirection, yPositionDirection)) {
+            // If we get here, that means we never found a selectable that contains our gesture
+            // position. This is the first selectable that is after the position,
             // so our slot must be between the previous and current selectables.
-            Direction.BEFORE -> currentSlot - 1
+            BEFORE -> currentSlot - 1
 
-            // The gesture position intersects the bounds of the selectable in the y-axis.
-            // Now, search along the x-axis.
-            Direction.ON -> {
-                when (xPositionDirection) {
-                    // Same logic as BEFORE above, but along the x-axis.
-                    Direction.BEFORE -> currentSlot - 1
-
-                    // The gesture position is directly on this selectable, so use this one.
-                    Direction.ON -> currentSlot
-
-                    // keep looking
-                    Direction.AFTER -> slot
-                }
-            }
+            // The gesture position is directly on this selectable, so use this one.
+            ON -> currentSlot
 
             // keep looking
-            Direction.AFTER -> slot
+            AFTER -> slot
         }
     }
 }
@@ -566,6 +562,24 @@
 }
 
 /**
+ * Determine direction based on an x/y direction.
+ *
+ * This will use the [y] direction unless it is [ON],
+ * in which case it will use the [x] direction.
+ */
+internal fun resolve2dDirection(x: Direction, y: Direction): Direction =
+    when (y) {
+        BEFORE -> BEFORE
+        ON -> when (x) {
+            BEFORE -> BEFORE
+            ON -> ON
+            AFTER -> AFTER
+        }
+
+        AFTER -> AFTER
+    }
+
+/**
  * Data about a specific selectable within a [SelectionLayout].
  */
 internal class SelectableInfo(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
index 915309a..7f3589b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
@@ -746,8 +746,7 @@
     ) {
         previousSelectionLayout = null
         updateSelection(
-            startHandlePosition = position,
-            endHandlePosition = position,
+            position = position,
             previousHandlePosition = Offset.Unspecified,
             isStartHandle = isStartHandle,
             adjustment = adjustment
@@ -774,28 +773,8 @@
         adjustment: SelectionAdjustment,
     ): Boolean {
         if (newPosition == null) return false
-        val otherHandlePosition = selection?.let { selection ->
-            val otherSelectableId = if (isStartHandle) {
-                selection.end.selectableId
-            } else {
-                selection.start.selectableId
-            }
-            val otherSelectable =
-                selectionRegistrar.selectableMap[otherSelectableId] ?: return@let null
-            val handlePosition = otherSelectable.getHandlePosition(selection, !isStartHandle)
-            if (handlePosition.isUnspecified) return@let null
-            convertToContainerCoordinates(
-                otherSelectable.getLayoutCoordinates()!!,
-                getAdjustedCoordinates(handlePosition)
-            )
-        } ?: return false
-
-        val startHandlePosition = if (isStartHandle) newPosition else otherHandlePosition
-        val endHandlePosition = if (isStartHandle) otherHandlePosition else newPosition
-
         return updateSelection(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            position = newPosition,
             previousHandlePosition = previousPosition,
             isStartHandle = isStartHandle,
             adjustment = adjustment
@@ -809,8 +788,7 @@
      * selection handle is updated each time. The only exception is that when a new selection is
      * started. In this case, [previousHandlePosition] is always null.
      *
-     * @param startHandlePosition the position of the start selection handle.
-     * @param endHandlePosition the position of the end selection handle.
+     * @param position the position of the current gesture.
      * @param previousHandlePosition the position of the moving handle before the update.
      * @param isStartHandle whether the moving selection handle is the start handle.
      * @param adjustment the [SelectionAdjustment] used to adjust the raw selection range and
@@ -824,22 +802,15 @@
      * @see SelectionAdjustment
      */
     internal fun updateSelection(
-        startHandlePosition: Offset,
-        endHandlePosition: Offset,
+        position: Offset,
         previousHandlePosition: Offset,
         isStartHandle: Boolean,
         adjustment: SelectionAdjustment,
     ): Boolean {
         draggingHandle = if (isStartHandle) Handle.SelectionStart else Handle.SelectionEnd
-        currentDragPosition = if (isStartHandle) startHandlePosition else endHandlePosition
+        currentDragPosition = position
 
-        val selectionLayout = getSelectionLayout(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
-            previousHandlePosition = previousHandlePosition,
-            isStartHandle = isStartHandle,
-        )
-
+        val selectionLayout = getSelectionLayout(position, previousHandlePosition, isStartHandle)
         if (!selectionLayout.shouldRecomputeSelection(previousSelectionLayout)) {
             return false
         }
@@ -853,8 +824,7 @@
     }
 
     private fun getSelectionLayout(
-        startHandlePosition: Offset,
-        endHandlePosition: Offset,
+        position: Offset,
         previousHandlePosition: Offset,
         isStartHandle: Boolean,
     ): SelectionLayout {
@@ -871,8 +841,7 @@
         // if previous handle is null, then treat this as a new selection.
         val previousSelection = if (previousHandlePosition.isUnspecified) null else selection
         val builder = SelectionLayoutBuilder(
-            startHandlePosition = startHandlePosition,
-            endHandlePosition = endHandlePosition,
+            currentPosition = position,
             previousHandlePosition = previousHandlePosition,
             containerCoordinates = containerCoordinates,
             isStartHandle = isStartHandle,
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 922fd3a..29e29d1 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
@@ -210,6 +210,7 @@
                     )
 
                     enterSelectionMode(showFloatingToolbar = false)
+                    setHandleState(HandleState.Cursor)
                     hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
                     onValueChange(newValue)
                 }
@@ -299,14 +300,13 @@
                     )
                 }
             }
-            state?.showFloatingToolbar = false
+            updateFloatingToolbar(show = false)
         }
 
         override fun onStop() {
             draggingHandle = null
             currentDragPosition = null
-            state?.showFloatingToolbar = true
-            if (textToolbar?.status == TextToolbarStatus.Hidden) showSelectionToolbar()
+            updateFloatingToolbar(show = true)
             dragBeginOffsetInText = null
         }
 
@@ -398,13 +398,13 @@
                 draggingHandle = if (isStartHandle) Handle.SelectionStart else Handle.SelectionEnd
                 currentDragPosition = getAdjustedCoordinates(getHandlePosition(isStartHandle))
                 state?.isInTouchMode = true
-                state?.showFloatingToolbar = false
+                updateFloatingToolbar(show = false)
             }
 
             override fun onUp() {
                 draggingHandle = null
                 currentDragPosition = null
-                state?.showFloatingToolbar = true
+                updateFloatingToolbar(show = true)
             }
 
             override fun onStart(startPoint: Offset) {
@@ -416,7 +416,7 @@
                 // Zero out the total distance that being dragged.
                 dragTotalDistance = Offset.Zero
                 draggingHandle = if (isStartHandle) Handle.SelectionStart else Handle.SelectionEnd
-                state?.showFloatingToolbar = false
+                updateFloatingToolbar(show = false)
             }
 
             override fun onDrag(delta: Offset) {
@@ -431,14 +431,13 @@
                     adjustment = SelectionAdjustment.CharacterWithWordAccelerate,
                     isTouchBasedSelection = true, // handle drag infers touch
                 )
-                state?.showFloatingToolbar = false
+                updateFloatingToolbar(show = false)
             }
 
             override fun onStop() {
                 draggingHandle = null
                 currentDragPosition = null
-                state?.showFloatingToolbar = true
-                if (textToolbar?.status == TextToolbarStatus.Hidden) showSelectionToolbar()
+                updateFloatingToolbar(show = true)
             }
 
             override fun onCancel() {}
@@ -449,8 +448,7 @@
      */
     internal fun cursorDragObserver(): TextDragObserver = object : TextDragObserver {
         override fun onDown(point: Offset) {
-            draggingHandle = Handle.Cursor
-            currentDragPosition = getAdjustedCoordinates(getHandlePosition(true))
+            // Nothing
         }
 
         override fun onUp() {
@@ -466,6 +464,7 @@
             // Zero out the total distance that being dragged.
             dragTotalDistance = Offset.Zero
             draggingHandle = Handle.Cursor
+            updateFloatingToolbar(show = false)
         }
 
         override fun onDrag(delta: Offset) {
@@ -515,7 +514,7 @@
             focusRequester?.requestFocus()
         }
         oldValue = value
-        state?.showFloatingToolbar = showFloatingToolbar
+        updateFloatingToolbar(showFloatingToolbar)
         setHandleState(HandleState.Selection)
     }
 
@@ -525,7 +524,7 @@
      * Is triggered on accessibility action.
      */
     internal fun exitSelectionMode() {
-        state?.showFloatingToolbar = false
+        updateFloatingToolbar(show = false)
         setHandleState(HandleState.None)
     }
 
@@ -553,7 +552,7 @@
             HandleState.None
         }
         setHandleState(selectionMode)
-        hideSelectionToolbar()
+        updateFloatingToolbar(show = false)
     }
 
     /**
@@ -645,7 +644,7 @@
         )
         onValueChange(newValue)
         oldValue = oldValue.copy(selection = newValue.selection)
-        state?.showFloatingToolbar = true
+        updateFloatingToolbar(show = true)
     }
 
     internal fun getHandlePosition(isStartHandle: Boolean): Offset {
@@ -671,6 +670,19 @@
     }
 
     /**
+     * Update the [TextFieldState.showFloatingToolbar] state and show/hide the toolbar.
+     *
+     * You may want to call [showSelectionToolbar] and [hideSelectionToolbar] directly without
+     * updating the [TextFieldState.showFloatingToolbar] if you are simply hiding all touch
+     * selection behaviors (toolbar, handles, cursor, magnifier), but want the toolbar to come
+     * back when you un-hide all those behaviors.
+     */
+    private fun updateFloatingToolbar(show: Boolean) {
+        state?.showFloatingToolbar = show
+        if (show) showSelectionToolbar() else hideSelectionToolbar()
+    }
+
+    /**
      * This function get the selected region as a Rectangle region, and pass it to [TextToolbar]
      * to make the FloatingToolbar show up in the proper place. In addition, this function passes
      * the copy, paste and cut method as callbacks when "copy", "cut" or "paste" is clicked.
@@ -882,6 +894,9 @@
         )
         onValueChange(newValue)
 
+        val handle = if (newValue.selection.collapsed) HandleState.Cursor else HandleState.Selection
+        setHandleState(handle)
+
         state?.isInTouchMode = isTouchBasedSelection
 
         // showSelectionHandleStart/End might be set to false when scrolled out of the view.
@@ -894,7 +909,7 @@
     }
 
     private fun setHandleState(handleState: HandleState) {
-        state?.let { it.handleState = handleState }
+        state?.takeUnless { it.handleState == handleState }?.let { it.handleState = handleState }
     }
 
     private fun createTextFieldValue(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/BasicTextField2.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/BasicTextField2.kt
index d7abaa4..cf09e8d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/BasicTextField2.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/BasicTextField2.kt
@@ -26,6 +26,7 @@
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.interaction.collectIsFocusedAsState
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.heightIn
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.text.CursorHandle
 import androidx.compose.foundation.text.Handle
@@ -413,6 +414,7 @@
             Box(
                 propagateMinConstraints = true,
                 modifier = Modifier
+                    .heightIn(min = textLayoutState.minHeightForSingleLineField)
                     .heightInLines(
                         textStyle = textStyle,
                         minLines = minLines,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextFieldDecoratorModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextFieldDecoratorModifier.kt
index 05e360b..ae67c8e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextFieldDecoratorModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextFieldDecoratorModifier.kt
@@ -23,6 +23,7 @@
 import androidx.compose.foundation.text2.BasicTextField2
 import androidx.compose.foundation.text2.input.InputTransformation
 import androidx.compose.foundation.text2.input.internal.selection.TextFieldSelectionState
+import androidx.compose.foundation.text2.input.internal.selection.TextToolbarState
 import androidx.compose.ui.focus.FocusDirection
 import androidx.compose.ui.focus.FocusEventModifierNode
 import androidx.compose.ui.focus.FocusManager
@@ -53,7 +54,7 @@
 import androidx.compose.ui.platform.PlatformTextInputSession
 import androidx.compose.ui.platform.SoftwareKeyboardController
 import androidx.compose.ui.platform.WindowInfo
-import androidx.compose.ui.platform.textInputSession
+import androidx.compose.ui.platform.runTextInputSession
 import androidx.compose.ui.semantics.SemanticsPropertyReceiver
 import androidx.compose.ui.semantics.copyText
 import androidx.compose.ui.semantics.cutText
@@ -63,6 +64,7 @@
 import androidx.compose.ui.semantics.insertTextAtCursor
 import androidx.compose.ui.semantics.onClick
 import androidx.compose.ui.semantics.onImeAction
+import androidx.compose.ui.semantics.onLongClick
 import androidx.compose.ui.semantics.pasteText
 import androidx.compose.ui.semantics.setSelection
 import androidx.compose.ui.semantics.setText
@@ -311,6 +313,10 @@
         }
         @Suppress("NAME_SHADOWING")
         setSelection { start, end, relativeToOriginal ->
+            // in traversal mode (relativeToOriginal=true) we get selection from the
+            // `textSelectionRange` semantics which is selection in original text. In non-traversal
+            // mode selection comes from the Talkback and indices are relative to the transformed
+            // text
             val text = if (relativeToOriginal) {
                 textFieldState.untransformedText
             } else {
@@ -331,6 +337,13 @@
             }
 
             val selectionRange = TextRange(start, end)
+            // Do not show toolbar if it's a traversal mode (with the volume keys), or if the
+            // selection is collapsed.
+            if (relativeToOriginal || start == end) {
+                textFieldSelectionState.updateTextToolbarState(TextToolbarState.None)
+            } else {
+                textFieldSelectionState.updateTextToolbarState(TextToolbarState.Selection)
+            }
             if (relativeToOriginal) {
                 textFieldState.selectUntransformedCharsIn(selectionRange)
             } else {
@@ -360,6 +373,13 @@
             }
             true
         }
+        onLongClick {
+            if (!isFocused) {
+                requestFocus()
+            }
+            textFieldSelectionState.updateTextToolbarState(TextToolbarState.Selection)
+            true
+        }
         if (!selection.collapsed) {
             copyText {
                 textFieldSelectionState.copy()
@@ -456,7 +476,7 @@
         inputSessionJob = coroutineScope.launch {
             // This will automatically cancel the previous session, if any, so we don't need to
             // cancel the inputSessionJob ourselves.
-            textInputSession {
+            runTextInputSession {
                 // Re-start observing changes in case our TextFieldState instance changed.
                 launch(start = CoroutineStart.UNDISPATCHED) {
                     textFieldSelectionState.observeChanges()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextFieldTextLayoutModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextFieldTextLayoutModifier.kt
index c69bce5..e6de7e8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextFieldTextLayoutModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextFieldTextLayoutModifier.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.text2.input.internal
 
+import androidx.compose.foundation.text.ceilToIntPx
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.FirstBaseline
 import androidx.compose.ui.layout.LastBaseline
@@ -34,6 +35,7 @@
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
 
 /**
@@ -77,7 +79,7 @@
     private var textLayoutState: TextLayoutState,
     textFieldState: TransformedTextFieldState,
     textStyle: TextStyle,
-    singleLine: Boolean,
+    private var singleLine: Boolean,
     onTextLayout: Density.(getResult: () -> TextLayoutResult?) -> Unit
 ) : Modifier.Node(),
     LayoutModifierNode,
@@ -106,6 +108,7 @@
     ) {
         this.textLayoutState = textLayoutState
         this.textLayoutState.onTextLayout = onTextLayout
+        this.singleLine = singleLine
         this.textLayoutState.updateNonMeasureInputs(
             textFieldState = textFieldState,
             textStyle = textStyle,
@@ -133,7 +136,15 @@
             Constraints.fixed(result.size.width, result.size.height)
         )
 
-        // TODO: min height
+        // calculate the min height for single line text to prevent text cuts.
+        // for single line text maxLines puts in max height constraint based on
+        // constant characters therefore if the user enters a character that is
+        // longer (i.e. emoji or a tall script) the text is cut
+        textLayoutState.minHeightForSingleLineField = if (singleLine) {
+            result.getLineBottom(0).ceilToIntPx().toDp()
+        } else {
+            0.dp
+        }
 
         return layout(
             width = result.size.width,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextLayoutState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextLayoutState.kt
index 8cb2d62..29df3cd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextLayoutState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/TextLayoutState.kt
@@ -30,6 +30,7 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
 
 /**
  * Manages text layout for TextField including layout coordinates of decoration box and inner text
@@ -73,6 +74,11 @@
     var decoratorNodeCoordinates: LayoutCoordinates? by mutableStateOf(null, neverEqualPolicy())
 
     /**
+     * Set to a non-zero value for single line TextFields in order to prevent text cuts.
+     */
+    var minHeightForSingleLineField by mutableStateOf(0.dp)
+
+    /**
      * Updates the [TextFieldLayoutStateCache] with inputs that don't come from the measure phase.
      * This method will initialize the cache the first time it's called.
      * If the new inputs require re-calculating text layout, any readers of [layoutResult] called
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/selection/TextFieldSelectionState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/selection/TextFieldSelectionState.kt
index 069d2c1..54c30a7 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/selection/TextFieldSelectionState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text2/input/internal/selection/TextFieldSelectionState.kt
@@ -46,6 +46,7 @@
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.isSpecified
 import androidx.compose.ui.geometry.isUnspecified
 import androidx.compose.ui.hapticfeedback.HapticFeedback
 import androidx.compose.ui.hapticfeedback.HapticFeedbackType
@@ -168,10 +169,10 @@
     private var showCursorHandle by mutableStateOf(false)
 
     /**
-     * Request to show the text toolbar right now, anchored to the cursor handle. This is not the
-     * final decider for showing the toolbar. Please refer to [observeTextToolbarVisibility] docs.
+     * Whether to show the TextToolbar according to current selection state. This is not the final
+     * decider for showing the toolbar. Please refer to [observeTextToolbarVisibility] docs.
      */
-    private var showCursorHandleToolbar by mutableStateOf(false)
+    private var textToolbarState by mutableStateOf(TextToolbarState.None)
 
     /**
      * Access helper for text layout node coordinates that checks attached state.
@@ -321,7 +322,11 @@
             }
             launch(start = CoroutineStart.UNDISPATCHED) {
                 detectTapGestures(onTap = {
-                    showCursorHandleToolbar = !showCursorHandleToolbar
+                    textToolbarState = if (textToolbarState == TextToolbarState.Cursor) {
+                        TextToolbarState.None
+                    } else {
+                        TextToolbarState.Cursor
+                    }
                 })
             }
         }
@@ -391,12 +396,16 @@
             }
         } finally {
             showCursorHandle = false
-            if (showCursorHandleToolbar) {
+            if (textToolbarState != TextToolbarState.None) {
                 hideTextToolbar()
             }
         }
     }
 
+    fun updateTextToolbarState(textToolbarState: TextToolbarState) {
+        this.textToolbarState = textToolbarState
+    }
+
     fun dispose() {
         hideTextToolbar()
 
@@ -434,7 +443,8 @@
                         showCursorHandle = true
                     }
 
-                    showCursorHandleToolbar = false
+                    // do not show any TextToolbar.
+                    updateTextToolbarState(TextToolbarState.None)
 
                     // find the cursor position
                     val cursorIndex = textLayoutState.getOffsetForPosition(offset)
@@ -449,7 +459,8 @@
                 // onTap is already called at this point. Focus is requested.
 
                 showCursorHandle = false
-                showCursorHandleToolbar = false
+                // go into selection mode.
+                updateTextToolbarState(TextToolbarState.Selection)
 
                 val index = textLayoutState.getOffsetForPosition(offset)
                 val newSelection = updateSelection(
@@ -474,9 +485,12 @@
         var cursorDragDelta = Offset.Unspecified
 
         fun onDragStop() {
-            cursorDragStart = Offset.Unspecified
-            cursorDragDelta = Offset.Unspecified
-            clearHandleDragging()
+            // Only execute clear-up if drag was actually ongoing.
+            if (cursorDragStart.isSpecified) {
+                cursorDragStart = Offset.Unspecified
+                cursorDragDelta = Offset.Unspecified
+                clearHandleDragging()
+            }
         }
 
         // b/288931376: detectDragGestures do not call onDragCancel when composable is disposed.
@@ -524,14 +538,22 @@
         var dragTotalDistance: Offset = Offset.Zero
         var actingHandle: Handle = Handle.SelectionEnd // start with a placeholder.
 
+        fun onDragStop() {
+            // Only execute clear-up if drag was actually ongoing.
+            if (dragBeginPosition.isSpecified) {
+                clearHandleDragging()
+                dragBeginOffsetInText = -1
+                dragBeginPosition = Offset.Unspecified
+                dragTotalDistance = Offset.Zero
+                previousRawDragOffset = -1
+            }
+        }
+
         // offsets received by this gesture detector are in decoration box coordinates
         detectDragGesturesAfterLongPress(
             onDragStart = onDragStart@{ dragStartOffset ->
                 logDebug { "onDragStart after longPress $dragStartOffset" }
                 requestFocus()
-                // at the beginning of selection disable toolbar, re-evaluate visibility after
-                // drag gesture is finished
-                showCursorHandleToolbar = false
 
                 // this gesture detector is applied on the decoration box. We do not need to
                 // convert the gesture offset, that's going to be calculated by [handleDragPosition]
@@ -551,7 +573,7 @@
                     hapticFeedBack?.performHapticFeedback(HapticFeedbackType.TextHandleMove)
                     textFieldState.placeCursorBeforeCharAt(offset)
                     showCursorHandle = true
-                    showCursorHandleToolbar = true
+                    updateTextToolbarState(TextToolbarState.Cursor)
                 } else {
                     if (textFieldState.text.isEmpty()) return@onDragStart
                     val offset = textLayoutState.getOffsetForPosition(dragStartOffset)
@@ -568,27 +590,15 @@
                         adjustment = SelectionAdjustment.CharacterWithWordAccelerate,
                     )
                     textFieldState.selectCharsIn(newSelection)
-                    showCursorHandle = false
+                    updateTextToolbarState(TextToolbarState.Selection)
                     // For touch, set the begin offset to the adjusted selection.
                     // When char based selection is used, we want to ensure we snap the
                     // beginning offset to the start word boundary of the first selected word.
                     dragBeginOffsetInText = newSelection.start
                 }
             },
-            onDragEnd = {
-                clearHandleDragging()
-                dragBeginOffsetInText = -1
-                dragBeginPosition = Offset.Unspecified
-                dragTotalDistance = Offset.Zero
-                previousRawDragOffset = -1
-            },
-            onDragCancel = {
-                clearHandleDragging()
-                dragBeginOffsetInText = -1
-                dragBeginPosition = Offset.Unspecified
-                dragTotalDistance = Offset.Zero
-                previousRawDragOffset = -1
-            },
+            onDragEnd = { onDragStop() },
+            onDragCancel = { onDragStop() },
             onDrag = onDrag@{ _, dragAmount ->
                 // selection never started, did not consume any drag
                 if (textFieldState.text.isEmpty()) return@onDrag
@@ -716,10 +726,13 @@
         val handle = if (isStartHandle) Handle.SelectionStart else Handle.SelectionEnd
 
         fun onDragStop() {
-            clearHandleDragging()
-            dragBeginPosition = Offset.Unspecified
-            dragTotalDistance = Offset.Zero
-            previousRawDragOffset = -1
+            // Only execute clear-up if drag was actually ongoing.
+            if (dragBeginPosition.isSpecified) {
+                clearHandleDragging()
+                dragBeginPosition = Offset.Unspecified
+                dragTotalDistance = Offset.Zero
+                previousRawDragOffset = -1
+            }
         }
 
         // b/288931376: detectDragGestures do not call onDragCancel when composable is disposed.
@@ -792,7 +805,8 @@
             .drop(1)
             .collect {
                 showCursorHandle = false
-                showCursorHandleToolbar = false
+                // hide the toolbar any time text content changes.
+                updateTextToolbarState(TextToolbarState.None)
             }
     }
 
@@ -800,28 +814,34 @@
      * Manages the visibility of text toolbar according to current state and received events from
      * various sources.
      *
-     * - Tapping the cursor handle toggles the visibility of the toolbar [showCursorHandleToolbar].
+     * - Tapping the cursor handle toggles the visibility of the toolbar [TextToolbarState.Cursor].
      * - Dragging the cursor handle or selection handles temporarily hides the toolbar
      * [draggingHandle].
-     * - Tapping somewhere on the textfield, whether it causes a cursor position change or not,
-     * fully hides the toolbar [showCursorHandleToolbar].
-     * - Scrolling the textfield temporarily hides the toolbar [getContentRect].
-     * - When cursor leaves the visible bounds, text toolbar is temporarily hidden.
+     * - Tapping somewhere on the TextField, whether it causes a cursor position change or not,
+     * fully hides the toolbar [TextToolbarState.None].
+     * - When cursor or selection leaves the visible bounds, text toolbar is temporarily hidden.
+     * [getContentRect]
+     * - When selection is initiated via long press, double click, or semantics, text toolbar shows
+     * [TextToolbarState.Selection]
      */
     private suspend fun observeTextToolbarVisibility() {
         snapshotFlow {
             val isCollapsed = textFieldState.text.selectionInChars.collapsed
-            val toolbarVisibility =
-                // either toolbar is requested specifically or selection is active
-                (showCursorHandleToolbar || !isCollapsed) &&
+            val textToolbarStateVisible =
+                isCollapsed && textToolbarState == TextToolbarState.Cursor ||
+                    !isCollapsed && textToolbarState == TextToolbarState.Selection
+
+            val textToolbarVisible =
+                // toolbar is requested specifically for the current selection state
+                textToolbarStateVisible &&
                     draggingHandle == null && // not dragging any selection handles
-                    isInTouchMode
+                    isInTouchMode // toolbar hidden when not in touch mode
 
             // final visibility decision is made by contentRect visibility.
             // if contentRect is not in visible bounds, just pass Rect.Zero to the observer so that
             // it hides the toolbar. If Rect is successfully passed to the observer, toolbar will
             // be displayed.
-            if (!toolbarVisibility) {
+            if (!textToolbarVisible) {
                 Rect.Zero
             } else {
                 // contentRect is calculated in root coordinates. VisibleBounds are in parent
@@ -1055,28 +1075,28 @@
         val paste: (() -> Unit)? = if (editable && clipboardManager?.hasText() == true) {
             {
                 paste()
-                showCursorHandleToolbar = false
+                updateTextToolbarState(TextToolbarState.None)
             }
         } else null
 
         val copy: (() -> Unit)? = if (!selection.collapsed) {
             {
                 copy()
-                showCursorHandleToolbar = false
+                updateTextToolbarState(TextToolbarState.None)
             }
         } else null
 
         val cut: (() -> Unit)? = if (!selection.collapsed && editable) {
             {
                 cut()
-                showCursorHandleToolbar = false
+                updateTextToolbarState(TextToolbarState.None)
             }
         } else null
 
         val selectAll: (() -> Unit)? = if (selection.length != textFieldState.text.length) {
             {
                 textFieldState.selectAll()
-                showCursorHandleToolbar = false
+                updateTextToolbarState(TextToolbarState.Selection)
             }
         } else null
 
@@ -1095,7 +1115,7 @@
         }
 
         showCursorHandle = false
-        showCursorHandleToolbar = false
+        updateTextToolbarState(TextToolbarState.None)
     }
 
     private fun hideTextToolbar() {
@@ -1189,6 +1209,21 @@
 
 private fun TextRange.reverse() = TextRange(end, start)
 
+/**
+ * A state that indicates when to show TextToolbar.
+ *
+ * - [None] Do not show the TextToolbar at all.
+ * - [Cursor] if selection is collapsed and all the other criteria are met, show the TextToolbar.
+ * - [Selection] if selection is expanded and all the other criteria are met, show the TextToolbar.
+ *
+ * @see [TextFieldSelectionState.observeTextToolbarVisibility]
+ */
+internal enum class TextToolbarState {
+    None,
+    Cursor,
+    Selection,
+}
+
 private const val DEBUG = false
 private const val DEBUG_TAG = "TextFieldSelectionState"
 
diff --git a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationItem.kt b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationItem.kt
index 9588385..d06bd80 100644
--- a/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationItem.kt
+++ b/compose/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/specification/SpecificationItem.kt
@@ -24,7 +24,6 @@
 import androidx.compose.material.catalog.model.Specification
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
-import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.OutlinedCard
@@ -34,7 +33,6 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun SpecificationItem(
     specification: Specification,
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 23b8cb7..6861336 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
@@ -54,14 +54,13 @@
     } ?: return null
 
     val metadata = KotlinClassMetadata.read(classKotlinMetadataPsiAnnotation.toMetadataAnnotation())
-        ?: return null
 
     return when (metadata) {
-        is KotlinClassMetadata.Class -> metadata.toKmClass()
-        is KotlinClassMetadata.FileFacade -> metadata.toKmPackage()
+        is KotlinClassMetadata.Class -> metadata.kmClass
+        is KotlinClassMetadata.FileFacade -> metadata.kmPackage
         is KotlinClassMetadata.SyntheticClass -> null
         is KotlinClassMetadata.MultiFileClassFacade -> null
-        is KotlinClassMetadata.MultiFileClassPart -> metadata.toKmPackage()
+        is KotlinClassMetadata.MultiFileClassPart -> metadata.kmPackage
         is KotlinClassMetadata.Unknown -> null
     }
 }
@@ -129,8 +128,8 @@
 
     return functions.find {
         it.name == expectedName && (
-            it.signature?.desc == expectedSignature ||
-                it.signature?.desc == expectedSignatureConvertedFromUnitToVoid
+            it.signature?.descriptor == expectedSignature ||
+                it.signature?.descriptor == expectedSignatureConvertedFromUnitToVoid
         )
     }
 }
diff --git a/compose/material/material/api/api_lint.ignore b/compose/material/material/api/api_lint.ignore
index 1ab2ffe..21f1bf6 100644
--- a/compose/material/material/api/api_lint.ignore
+++ b/compose/material/material/api/api_lint.ignore
@@ -1,8 +1,4 @@
 // Baseline format: 1.0
-KotlinDefaultParameterOrder: androidx.compose.material.ModalBottomSheetKt#rememberModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue, androidx.compose.animation.core.AnimationSpec<java.lang.Float>, boolean, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean>) parameter #1:
-    Parameter `animationSpec` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
-KotlinDefaultParameterOrder: androidx.compose.material.ModalBottomSheetState#ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue, androidx.compose.animation.core.AnimationSpec<java.lang.Float>, boolean, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean>) parameter #1:
-    Parameter `animationSpec` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
 KotlinDefaultParameterOrder: androidx.compose.material.SwipeToDismissKt#SwipeToDismiss(androidx.compose.material.DismissState, androidx.compose.ui.Modifier, java.util.Set<? extends androidx.compose.material.DismissDirection>, kotlin.jvm.functions.Function1<? super androidx.compose.material.DismissDirection,? extends androidx.compose.material.ThresholdConfig>, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>) parameter #1:
     Parameter `modifier` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
 KotlinDefaultParameterOrder: androidx.compose.material.SwipeToDismissKt#SwipeToDismiss(androidx.compose.material.DismissState, androidx.compose.ui.Modifier, java.util.Set<? extends androidx.compose.material.DismissDirection>, kotlin.jvm.functions.Function1<? super androidx.compose.material.DismissDirection,? extends androidx.compose.material.ThresholdConfig>, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>) parameter #2:
diff --git a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TextTest.kt b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TextTest.kt
index c88d6a5..e32bd12 100644
--- a/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TextTest.kt
+++ b/compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/TextTest.kt
@@ -22,9 +22,13 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertTextEquals
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performSemanticsAction
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextStyle
@@ -255,4 +259,24 @@
             .performSemanticsAction(SemanticsActions.GetTextLayoutResult) { it(textLayoutResults) }
         assert(textLayoutResults.size == 1) { "TextLayoutResult is null" }
     }
+
+    @Test
+    fun semantics_hasColor_providedByParameter() {
+        val expectedColor = Color(0.7f, 0.13f, 1.0f, 0.323f)
+        rule.setContent {
+            Text(
+                "Test",
+                color = expectedColor
+            )
+        }
+
+        rule.onNodeWithText("Test").assert(SemanticsMatcher("") {
+            val textLayoutResult = ArrayList<TextLayoutResult>()
+            it.config.getOrNull(SemanticsActions.GetTextLayoutResult)?.action?.invoke(
+                textLayoutResult
+            )
+            val color = textLayoutResult.first().layoutInput.style.color
+            color == expectedColor
+        })
+    }
 }
diff --git a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CardBenchmark.kt b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CardBenchmark.kt
index d82f319..81c1d8a 100644
--- a/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CardBenchmark.kt
+++ b/compose/material3/benchmark/src/androidTest/java/androidx/compose/material3/benchmark/CardBenchmark.kt
@@ -18,7 +18,6 @@
 
 import androidx.compose.foundation.layout.size
 import androidx.compose.material3.Card
-import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.runtime.Composable
 import androidx.compose.testutils.LayeredComposeTestCase
@@ -99,7 +98,6 @@
 
 internal class ClickableCardTestCase : LayeredComposeTestCase() {
 
-    @OptIn(ExperimentalMaterial3Api::class)
     @Composable
     override fun MeasuredContent() {
         Card(onClick = {}, modifier = Modifier.size(200.dp)) { }
diff --git a/compose/material3/material3-adaptive/api/current.txt b/compose/material3/material3-adaptive/api/current.txt
index 1a6cd1b..15b55c6 100644
--- a/compose/material3/material3-adaptive/api/current.txt
+++ b/compose/material3/material3-adaptive/api/current.txt
@@ -16,24 +16,22 @@
   }
 
   public final class AndroidWindowInfo_androidKt {
-    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.material3.adaptive.WindowAdaptiveInfo calculateWindowAdaptiveInfo();
-    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.util.List<androidx.window.layout.FoldingFeature>> foldingFeaturesAsState();
-    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> windowSizeAsState();
+    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.util.List<androidx.window.layout.FoldingFeature>> collectFoldingFeaturesAsState();
+    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> collectWindowSizeAsState();
+    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.material3.adaptive.WindowAdaptiveInfo currentWindowAdaptiveInfo();
   }
 
   @SuppressCompatibility @kotlin.RequiresOptIn(message="This material3-adaptive API is experimental and is likely to change or to be" + "removed in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalMaterial3AdaptiveApi {
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Immutable public final class GutterSizes {
-    ctor public GutterSizes(float outerVertical, float innerVertical, optional float outerHorizontal, optional float innerHorizontal);
-    method public float getInnerHorizontal();
-    method public float getInnerVertical();
-    method public float getOuterHorizontal();
-    method public float getOuterVertical();
-    property public final float innerHorizontal;
-    property public final float innerVertical;
-    property public final float outerHorizontal;
-    property public final float outerVertical;
+    ctor public GutterSizes(androidx.compose.foundation.layout.PaddingValues contentPadding, float verticalSpacerSize, optional float horizontalSpacerSize);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getHorizontalSpacerSize();
+    method public float getVerticalSpacerSize();
+    property public final androidx.compose.foundation.layout.PaddingValues contentPadding;
+    property public final float horizontalSpacerSize;
+    property public final float verticalSpacerSize;
   }
 
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class HingePolicy {
diff --git a/compose/material3/material3-adaptive/api/restricted_current.txt b/compose/material3/material3-adaptive/api/restricted_current.txt
index 1a6cd1b..15b55c6 100644
--- a/compose/material3/material3-adaptive/api/restricted_current.txt
+++ b/compose/material3/material3-adaptive/api/restricted_current.txt
@@ -16,24 +16,22 @@
   }
 
   public final class AndroidWindowInfo_androidKt {
-    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.material3.adaptive.WindowAdaptiveInfo calculateWindowAdaptiveInfo();
-    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.util.List<androidx.window.layout.FoldingFeature>> foldingFeaturesAsState();
-    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> windowSizeAsState();
+    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.util.List<androidx.window.layout.FoldingFeature>> collectFoldingFeaturesAsState();
+    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> collectWindowSizeAsState();
+    method @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Composable public static androidx.compose.material3.adaptive.WindowAdaptiveInfo currentWindowAdaptiveInfo();
   }
 
   @SuppressCompatibility @kotlin.RequiresOptIn(message="This material3-adaptive API is experimental and is likely to change or to be" + "removed in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalMaterial3AdaptiveApi {
   }
 
   @SuppressCompatibility @androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi @androidx.compose.runtime.Immutable public final class GutterSizes {
-    ctor public GutterSizes(float outerVertical, float innerVertical, optional float outerHorizontal, optional float innerHorizontal);
-    method public float getInnerHorizontal();
-    method public float getInnerVertical();
-    method public float getOuterHorizontal();
-    method public float getOuterVertical();
-    property public final float innerHorizontal;
-    property public final float innerVertical;
-    property public final float outerHorizontal;
-    property public final float outerVertical;
+    ctor public GutterSizes(androidx.compose.foundation.layout.PaddingValues contentPadding, float verticalSpacerSize, optional float horizontalSpacerSize);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getHorizontalSpacerSize();
+    method public float getVerticalSpacerSize();
+    property public final androidx.compose.foundation.layout.PaddingValues contentPadding;
+    property public final float horizontalSpacerSize;
+    property public final float verticalSpacerSize;
   }
 
   @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class HingePolicy {
diff --git a/compose/material3/material3-adaptive/build.gradle b/compose/material3/material3-adaptive/build.gradle
index 0579140..3d01dc8 100644
--- a/compose/material3/material3-adaptive/build.gradle
+++ b/compose/material3/material3-adaptive/build.gradle
@@ -81,7 +81,6 @@
 
         androidInstrumentedTest {
             dependsOn(jvmTest)
-            dependsOn(androidMain)
             dependencies {
                 implementation(project(":compose:test-utils"))
                 implementation(project(":window:window-testing"))
diff --git a/compose/material3/material3-adaptive/samples/src/main/java/androidx/compose/material3-adaptive/samples/NavigationSuiteScaffoldSamples.kt b/compose/material3/material3-adaptive/samples/src/main/java/androidx/compose/material3-adaptive/samples/NavigationSuiteScaffoldSamples.kt
index 01ccec2..bba3254 100644
--- a/compose/material3/material3-adaptive/samples/src/main/java/androidx/compose/material3-adaptive/samples/NavigationSuiteScaffoldSamples.kt
+++ b/compose/material3/material3-adaptive/samples/src/main/java/androidx/compose/material3-adaptive/samples/NavigationSuiteScaffoldSamples.kt
@@ -26,7 +26,7 @@
 import androidx.compose.material3.adaptive.NavigationSuiteScaffold
 import androidx.compose.material3.adaptive.NavigationSuiteScaffoldDefaults
 import androidx.compose.material3.adaptive.NavigationSuiteType
-import androidx.compose.material3.adaptive.calculateWindowAdaptiveInfo
+import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
 import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
@@ -45,7 +45,7 @@
     var selectedItem by remember { mutableIntStateOf(0) }
     val navItems = listOf("Songs", "Artists", "Playlists")
     val navSuiteType =
-        NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(calculateWindowAdaptiveInfo())
+        NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(currentWindowAdaptiveInfo())
 
     NavigationSuiteScaffold(
         navigationSuiteItems = {
@@ -74,7 +74,7 @@
 fun NavigationSuiteScaffoldCustomConfigSample() {
     var selectedItem by remember { mutableIntStateOf(0) }
     val navItems = listOf("Songs", "Artists", "Playlists")
-    val adaptiveInfo = calculateWindowAdaptiveInfo()
+    val adaptiveInfo = currentWindowAdaptiveInfo()
     // Custom configuration that shows a navigation drawer in large screens.
     val customNavSuiteType = with(adaptiveInfo) {
         if (windowSizeClass.widthSizeClass == WindowWidthSizeClass.Expanded) {
diff --git a/compose/material3/material3-adaptive/samples/src/main/java/androidx/compose/material3-adaptive/samples/ThreePaneScaffoldSample.kt b/compose/material3/material3-adaptive/samples/src/main/java/androidx/compose/material3-adaptive/samples/ThreePaneScaffoldSample.kt
index fe8fcfe..87fce7e 100644
--- a/compose/material3/material3-adaptive/samples/src/main/java/androidx/compose/material3-adaptive/samples/ThreePaneScaffoldSample.kt
+++ b/compose/material3/material3-adaptive/samples/src/main/java/androidx/compose/material3-adaptive/samples/ThreePaneScaffoldSample.kt
@@ -37,7 +37,7 @@
 import androidx.compose.material3.adaptive.ThreePaneScaffoldDefaults
 import androidx.compose.material3.adaptive.calculateStandardPaneScaffoldDirective
 import androidx.compose.material3.adaptive.calculateThreePaneScaffoldValue
-import androidx.compose.material3.adaptive.calculateWindowAdaptiveInfo
+import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
 import androidx.compose.material3.adaptive.rememberListDetailPaneScaffoldState
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
@@ -182,7 +182,7 @@
 @Preview
 @Composable
 internal fun ThreePaneScaffoldSample() {
-    val scaffoldDirective = calculateStandardPaneScaffoldDirective(calculateWindowAdaptiveInfo())
+    val scaffoldDirective = calculateStandardPaneScaffoldDirective(currentWindowAdaptiveInfo())
     ThreePaneScaffold(
         modifier = Modifier.fillMaxSize(),
         scaffoldDirective = scaffoldDirective,
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CalculateWindowAdaptiveInfoTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CalculateWindowAdaptiveInfoTest.kt
deleted file mode 100644
index 816c5bb..0000000
--- a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CalculateWindowAdaptiveInfoTest.kt
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.material3.adaptive
-
-import android.content.res.Configuration
-import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
-import androidx.compose.material3.windowsizeclass.WindowSizeClass
-import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.ui.platform.LocalConfiguration
-import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.unit.toSize
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import androidx.window.layout.FoldingFeature
-import androidx.window.layout.WindowLayoutInfo
-import androidx.window.layout.WindowMetricsCalculator
-import androidx.window.testing.layout.WindowLayoutInfoPublisherRule
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.RuleChain
-import org.junit.rules.TestRule
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalMaterial3AdaptiveApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class CalculateWindowAdaptiveInfoTest {
-    private val composeRule = createComposeRule()
-    private val layoutInfoRule = WindowLayoutInfoPublisherRule()
-
-    @get:Rule
-    val testRule: TestRule
-    init {
-        testRule = RuleChain.outerRule(layoutInfoRule).around(composeRule)
-    }
-
-    @OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
-    @Test
-    fun test_calculateWindowAdaptiveInfo() {
-        lateinit var actualAdaptiveInfo: WindowAdaptiveInfo
-        val mockWindowSize = mutableStateOf(MockWindowSize1)
-        WindowMetricsCalculator.overrideDecorator(
-            MockWindowMetricsCalculatorDecorator(mockWindowSize)
-        )
-
-        composeRule.setContent {
-            val testConfiguration = Configuration(LocalConfiguration.current)
-            testConfiguration.screenWidthDp = mockWindowSize.value.width
-            testConfiguration.screenHeightDp = mockWindowSize.value.height
-            CompositionLocalProvider(
-                LocalDensity provides MockDensity,
-                LocalConfiguration provides testConfiguration
-            ) {
-                actualAdaptiveInfo = calculateWindowAdaptiveInfo()
-            }
-        }
-
-        layoutInfoRule.overrideWindowLayoutInfo(
-            WindowLayoutInfo(MockFoldingFeatures1)
-        )
-
-        composeRule.runOnIdle {
-            assertThat(actualAdaptiveInfo.windowSizeClass).isEqualTo(
-                WindowSizeClass.calculateFromSize(
-                    with(MockDensity) { MockWindowSize1.toSize().toDpSize() }
-                )
-            )
-            assertThat(actualAdaptiveInfo.posture).isEqualTo(calculatePosture(MockFoldingFeatures1))
-        }
-
-        layoutInfoRule.overrideWindowLayoutInfo(
-            WindowLayoutInfo(MockFoldingFeatures2)
-        )
-        mockWindowSize.value = MockWindowSize2
-
-        composeRule.runOnIdle {
-            assertThat(actualAdaptiveInfo.windowSizeClass).isEqualTo(
-                WindowSizeClass.calculateFromSize(
-                    with(MockDensity) { MockWindowSize2.toSize().toDpSize() }
-                )
-            )
-            assertThat(actualAdaptiveInfo.posture).isEqualTo(calculatePosture(MockFoldingFeatures2))
-        }
-    }
-
-    companion object {
-        private val MockFoldingFeatures1 = listOf(
-            MockFoldingFeature(orientation = FoldingFeature.Orientation.HORIZONTAL),
-            MockFoldingFeature(orientation = FoldingFeature.Orientation.VERTICAL),
-            MockFoldingFeature(orientation = FoldingFeature.Orientation.HORIZONTAL)
-        )
-
-        private val MockFoldingFeatures2 = listOf(
-            MockFoldingFeature(
-                isSeparating = false,
-                orientation = FoldingFeature.Orientation.HORIZONTAL,
-                state = FoldingFeature.State.FLAT
-            ),
-        )
-
-        private val MockWindowSize1 = IntSize(400, 800)
-        private val MockWindowSize2 = IntSize(800, 400)
-
-        private val MockDensity = Density(1f, 1f)
-    }
-}
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectFoldingFeaturesAsStateTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectFoldingFeaturesAsStateTest.kt
new file mode 100644
index 0000000..1eb4823
--- /dev/null
+++ b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectFoldingFeaturesAsStateTest.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.material3.adaptive
+
+import android.graphics.Rect
+import androidx.compose.runtime.State
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.window.layout.DisplayFeature
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.WindowLayoutInfo
+import androidx.window.testing.layout.FoldingFeature
+import androidx.window.testing.layout.WindowLayoutInfoPublisherRule
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.RuleChain
+import org.junit.rules.TestRule
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalMaterial3AdaptiveApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class CollectFoldingFeaturesAsStateTest {
+    private val composeRule = createComposeRule()
+    private val publisherRule = WindowLayoutInfoPublisherRule()
+
+    @get:Rule
+    val testRule: TestRule
+    init {
+        testRule = RuleChain.outerRule(publisherRule).around(composeRule)
+    }
+
+    @Test
+    fun test_collectFoldingFeatureAsState_returnEmptyListInitially() {
+        lateinit var actualFoldingFeatures: State<List<FoldingFeature>>
+
+        composeRule.setContent {
+            actualFoldingFeatures = collectFoldingFeaturesAsState()
+        }
+
+        composeRule.runOnIdle {
+            assertThat(actualFoldingFeatures.value).isEmpty()
+        }
+    }
+
+    @Test
+    fun test_collectFoldingFeatureAsState_returnCurrentFoldingFeatures() {
+        lateinit var actualFoldingFeatures: State<List<FoldingFeature>>
+
+        composeRule.setContent {
+            actualFoldingFeatures = collectFoldingFeaturesAsState()
+        }
+
+        publisherRule.overrideWindowLayoutInfo(
+            WindowLayoutInfo(
+                listOf(MockFoldingFeature1, MockFoldingFeature2, MockDisplayFeature)
+            )
+        )
+
+        composeRule.runOnIdle {
+            assertThat(actualFoldingFeatures.value.size).isEqualTo(2)
+            assertThat(MockFoldingFeature1 in actualFoldingFeatures.value).isTrue()
+            assertThat(MockFoldingFeature2 in actualFoldingFeatures.value).isTrue()
+        }
+    }
+
+    companion object {
+        val MockFoldingFeature1 = FoldingFeature(
+            windowBounds = Rect(0, 0, 1024, 800),
+            size = 1
+        )
+        val MockFoldingFeature2 = FoldingFeature(
+            windowBounds = Rect(0, 0, 1024, 800),
+            size = 0
+        )
+        val MockDisplayFeature = object : DisplayFeature {
+            override val bounds = Rect(10, 10, 12, 12)
+        }
+    }
+}
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectWindowSizeAsStateTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectWindowSizeAsStateTest.kt
new file mode 100644
index 0000000..ec1328d
--- /dev/null
+++ b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CollectWindowSizeAsStateTest.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.material3.adaptive
+
+import android.app.Activity
+import android.content.Context
+import android.content.res.Configuration
+import android.graphics.Rect
+import androidx.annotation.UiContext
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.unit.IntSize
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.window.layout.WindowMetrics
+import androidx.window.layout.WindowMetricsCalculator
+import androidx.window.layout.WindowMetricsCalculatorDecorator
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalMaterial3AdaptiveApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class CollectWindowSizeAsStateTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun test_collectWindowSizeAsState() {
+        var actualWindowSize: IntSize = IntSize.Zero
+
+        val mockWindowSize = mutableStateOf(MockWindowSize1)
+        WindowMetricsCalculator.overrideDecorator(
+            MockWindowMetricsCalculatorDecorator(mockWindowSize)
+        )
+
+        rule.setContent {
+            val testConfiguration = Configuration(LocalConfiguration.current)
+            testConfiguration.screenWidthDp = mockWindowSize.value.width
+            testConfiguration.screenHeightDp = mockWindowSize.value.height
+            CompositionLocalProvider(LocalConfiguration provides testConfiguration) {
+                actualWindowSize = collectWindowSizeAsState().value
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(actualWindowSize).isEqualTo(MockWindowSize1)
+        }
+
+        mockWindowSize.value = MockWindowSize2
+
+        rule.runOnIdle {
+            assertThat(actualWindowSize).isEqualTo(MockWindowSize2)
+        }
+    }
+
+    companion object {
+        val MockWindowSize1 = IntSize(1000, 600)
+        val MockWindowSize2 = IntSize(800, 400)
+    }
+}
+
+internal class MockWindowMetricsCalculatorDecorator(
+    private val mockWindowSize: State<IntSize>
+) : WindowMetricsCalculatorDecorator {
+    override fun decorate(calculator: WindowMetricsCalculator): WindowMetricsCalculator {
+        return MockWindowMetricsCalculator(mockWindowSize)
+    }
+}
+
+internal class MockWindowMetricsCalculator(
+    private val mockWindowSize: State<IntSize>
+) : WindowMetricsCalculator {
+    override fun computeCurrentWindowMetrics(activity: Activity): WindowMetrics {
+        return WindowMetrics(
+            Rect(0, 0, mockWindowSize.value.width, mockWindowSize.value.height)
+        )
+    }
+
+    override fun computeMaximumWindowMetrics(activity: Activity): WindowMetrics {
+        return computeCurrentWindowMetrics(activity)
+    }
+
+    override fun computeCurrentWindowMetrics(@UiContext context: Context): WindowMetrics {
+        return WindowMetrics(
+            Rect(0, 0, mockWindowSize.value.width, mockWindowSize.value.height)
+        )
+    }
+}
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CurrentWindowAdaptiveInfoTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CurrentWindowAdaptiveInfoTest.kt
new file mode 100644
index 0000000..dcbfe12
--- /dev/null
+++ b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/CurrentWindowAdaptiveInfoTest.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.material3.adaptive
+
+import android.content.res.Configuration
+import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
+import androidx.compose.material3.windowsizeclass.WindowSizeClass
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.toSize
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.WindowLayoutInfo
+import androidx.window.layout.WindowMetricsCalculator
+import androidx.window.testing.layout.WindowLayoutInfoPublisherRule
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.RuleChain
+import org.junit.rules.TestRule
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalMaterial3AdaptiveApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class CurrentWindowAdaptiveInfoTest {
+    private val composeRule = createComposeRule()
+    private val layoutInfoRule = WindowLayoutInfoPublisherRule()
+
+    @get:Rule
+    val testRule: TestRule
+    init {
+        testRule = RuleChain.outerRule(layoutInfoRule).around(composeRule)
+    }
+
+    @OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
+    @Test
+    fun test_currentWindowAdaptiveInfo() {
+        lateinit var actualAdaptiveInfo: WindowAdaptiveInfo
+        val mockWindowSize = mutableStateOf(MockWindowSize1)
+        WindowMetricsCalculator.overrideDecorator(
+            MockWindowMetricsCalculatorDecorator(mockWindowSize)
+        )
+
+        composeRule.setContent {
+            val testConfiguration = Configuration(LocalConfiguration.current)
+            testConfiguration.screenWidthDp = mockWindowSize.value.width
+            testConfiguration.screenHeightDp = mockWindowSize.value.height
+            CompositionLocalProvider(
+                LocalDensity provides MockDensity,
+                LocalConfiguration provides testConfiguration
+            ) {
+                actualAdaptiveInfo = currentWindowAdaptiveInfo()
+            }
+        }
+
+        layoutInfoRule.overrideWindowLayoutInfo(
+            WindowLayoutInfo(MockFoldingFeatures1)
+        )
+
+        composeRule.runOnIdle {
+            assertThat(actualAdaptiveInfo.windowSizeClass).isEqualTo(
+                WindowSizeClass.calculateFromSize(
+                    with(MockDensity) { MockWindowSize1.toSize().toDpSize() }
+                )
+            )
+            assertThat(actualAdaptiveInfo.posture).isEqualTo(calculatePosture(MockFoldingFeatures1))
+        }
+
+        layoutInfoRule.overrideWindowLayoutInfo(
+            WindowLayoutInfo(MockFoldingFeatures2)
+        )
+        mockWindowSize.value = MockWindowSize2
+
+        composeRule.runOnIdle {
+            assertThat(actualAdaptiveInfo.windowSizeClass).isEqualTo(
+                WindowSizeClass.calculateFromSize(
+                    with(MockDensity) { MockWindowSize2.toSize().toDpSize() }
+                )
+            )
+            assertThat(actualAdaptiveInfo.posture).isEqualTo(calculatePosture(MockFoldingFeatures2))
+        }
+    }
+
+    companion object {
+        private val MockFoldingFeatures1 = listOf(
+            MockFoldingFeature(orientation = FoldingFeature.Orientation.HORIZONTAL),
+            MockFoldingFeature(orientation = FoldingFeature.Orientation.VERTICAL),
+            MockFoldingFeature(orientation = FoldingFeature.Orientation.HORIZONTAL)
+        )
+
+        private val MockFoldingFeatures2 = listOf(
+            MockFoldingFeature(
+                isSeparating = false,
+                orientation = FoldingFeature.Orientation.HORIZONTAL,
+                state = FoldingFeature.State.FLAT
+            ),
+        )
+
+        private val MockWindowSize1 = IntSize(400, 800)
+        private val MockWindowSize2 = IntSize(800, 400)
+
+        private val MockDensity = Density(1f, 1f)
+    }
+}
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/FoldingFeaturesAsStateTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/FoldingFeaturesAsStateTest.kt
deleted file mode 100644
index 709ddf0..0000000
--- a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/FoldingFeaturesAsStateTest.kt
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.material3.adaptive
-
-import android.graphics.Rect
-import androidx.compose.runtime.State
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import androidx.window.layout.DisplayFeature
-import androidx.window.layout.FoldingFeature
-import androidx.window.layout.WindowLayoutInfo
-import androidx.window.testing.layout.FoldingFeature
-import androidx.window.testing.layout.WindowLayoutInfoPublisherRule
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.RuleChain
-import org.junit.rules.TestRule
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalMaterial3AdaptiveApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class FoldingFeaturesAsStateTest {
-    private val composeRule = createComposeRule()
-    private val publisherRule = WindowLayoutInfoPublisherRule()
-
-    @get:Rule
-    val testRule: TestRule
-    init {
-        testRule = RuleChain.outerRule(publisherRule).around(composeRule)
-    }
-
-    @Test
-    fun test_foldingFeatureAsState_returnEmptyListInitially() {
-        lateinit var actualFoldingFeatures: State<List<FoldingFeature>>
-
-        composeRule.setContent {
-            actualFoldingFeatures = foldingFeaturesAsState()
-        }
-
-        composeRule.runOnIdle {
-            assertThat(actualFoldingFeatures.value).isEmpty()
-        }
-    }
-
-    @Test
-    fun test_foldingFeatureAsState_returnCurrentFoldingFeatures() {
-        lateinit var actualFoldingFeatures: State<List<FoldingFeature>>
-
-        composeRule.setContent {
-            actualFoldingFeatures = foldingFeaturesAsState()
-        }
-
-        publisherRule.overrideWindowLayoutInfo(
-            WindowLayoutInfo(
-                listOf(MockFoldingFeature1, MockFoldingFeature2, MockDisplayFeature)
-            )
-        )
-
-        composeRule.runOnIdle {
-            assertThat(actualFoldingFeatures.value.size).isEqualTo(2)
-            assertThat(MockFoldingFeature1 in actualFoldingFeatures.value).isTrue()
-            assertThat(MockFoldingFeature2 in actualFoldingFeatures.value).isTrue()
-        }
-    }
-
-    companion object {
-        val MockFoldingFeature1 = FoldingFeature(
-            windowBounds = Rect(0, 0, 1024, 800),
-            size = 1
-        )
-        val MockFoldingFeature2 = FoldingFeature(
-            windowBounds = Rect(0, 0, 1024, 800),
-            size = 0
-        )
-        val MockDisplayFeature = object : DisplayFeature {
-            override val bounds = Rect(10, 10, 12, 12)
-        }
-    }
-}
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ListDetailPaneScaffoldStateTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ListDetailPaneScaffoldStateTest.kt
index 6214ed4..cd2f37c 100644
--- a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ListDetailPaneScaffoldStateTest.kt
+++ b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ListDetailPaneScaffoldStateTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.material3.adaptive
 
+import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.dp
@@ -181,7 +182,7 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 private val MockSinglePaneScaffoldDirective = PaneScaffoldDirective(
     maxHorizontalPartitions = 1,
-    gutterSizes = GutterSizes(0.dp, 0.dp),
+    gutterSizes = GutterSizes(PaddingValues(0.dp), 0.dp),
     maxVerticalPartitions = 1,
     excludedBounds = emptyList()
 )
@@ -189,7 +190,7 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 private val MockDualPaneScaffoldDirective = PaneScaffoldDirective(
     maxHorizontalPartitions = 2,
-    gutterSizes = GutterSizes(16.dp, 16.dp),
+    gutterSizes = GutterSizes(PaddingValues(16.dp), 16.dp),
     maxVerticalPartitions = 1,
     excludedBounds = emptyList()
 )
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/SupportingPaneScaffoldStateTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/SupportingPaneScaffoldStateTest.kt
index d1c94ca..812482f 100644
--- a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/SupportingPaneScaffoldStateTest.kt
+++ b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/SupportingPaneScaffoldStateTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.material3.adaptive
 
+import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.dp
@@ -181,7 +182,7 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 private val MockSinglePaneScaffoldDirective = PaneScaffoldDirective(
     maxHorizontalPartitions = 1,
-    gutterSizes = GutterSizes(0.dp, 0.dp),
+    gutterSizes = GutterSizes(PaddingValues(0.dp), 0.dp),
     maxVerticalPartitions = 1,
     excludedBounds = emptyList()
 )
@@ -189,7 +190,7 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 private val MockDualPaneScaffoldDirective = PaneScaffoldDirective(
     maxHorizontalPartitions = 2,
-    gutterSizes = GutterSizes(16.dp, 16.dp),
+    gutterSizes = GutterSizes(PaddingValues(16.dp), 16.dp),
     maxVerticalPartitions = 1,
     excludedBounds = emptyList()
 )
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldScreenshotTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldScreenshotTest.kt
index c5793d7..a3a45ad 100644
--- a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldScreenshotTest.kt
+++ b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldScreenshotTest.kt
@@ -44,7 +44,7 @@
     fun threePaneScaffold_listDetailArrangement_standard() {
         rule.setContent {
             val scaffoldDirective = calculateStandardPaneScaffoldDirective(
-                calculateWindowAdaptiveInfo()
+                currentWindowAdaptiveInfo()
             )
             val scaffoldValue = calculateThreePaneScaffoldValue(
                 scaffoldDirective.maxHorizontalPartitions
@@ -65,7 +65,7 @@
     fun threePaneScaffold_listDetailArrangement_dense() {
         rule.setContent {
             val scaffoldDirective = calculateDensePaneScaffoldDirective(
-                calculateWindowAdaptiveInfo()
+                currentWindowAdaptiveInfo()
             )
             val scaffoldValue = calculateThreePaneScaffoldValue(
                 scaffoldDirective.maxHorizontalPartitions
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldTest.kt
index ad60581..d9b7506 100644
--- a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldTest.kt
+++ b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.material3.adaptive
 
+import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
@@ -106,7 +107,7 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 private val MockScaffoldDirective = PaneScaffoldDirective(
     maxHorizontalPartitions = 1,
-    gutterSizes = GutterSizes(0.dp, 0.dp),
+    gutterSizes = GutterSizes(PaddingValues(0.dp), 0.dp),
     maxVerticalPartitions = 1,
     excludedBounds = emptyList()
 )
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/WindowSizeAsStateTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/WindowSizeAsStateTest.kt
deleted file mode 100644
index 0b7d176..0000000
--- a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/WindowSizeAsStateTest.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.material3.adaptive
-
-import android.app.Activity
-import android.content.Context
-import android.content.res.Configuration
-import android.graphics.Rect
-import androidx.annotation.UiContext
-import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.State
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.ui.platform.LocalConfiguration
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.unit.IntSize
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import androidx.window.layout.WindowMetrics
-import androidx.window.layout.WindowMetricsCalculator
-import androidx.window.layout.WindowMetricsCalculatorDecorator
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalMaterial3AdaptiveApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class WindowSizeAsStateTest {
-    @get:Rule
-    val rule = createComposeRule()
-
-    @Test
-    fun test_windowSizeAsState() {
-        lateinit var actualWindowSize: State<IntSize>
-
-        val mockWindowSize = mutableStateOf(MockWindowSize1)
-        WindowMetricsCalculator.overrideDecorator(
-            MockWindowMetricsCalculatorDecorator(mockWindowSize)
-        )
-
-        rule.setContent {
-            val testConfiguration = Configuration(LocalConfiguration.current)
-            testConfiguration.screenWidthDp = mockWindowSize.value.width
-            testConfiguration.screenHeightDp = mockWindowSize.value.height
-            CompositionLocalProvider(LocalConfiguration provides testConfiguration) {
-                actualWindowSize = windowSizeAsState()
-            }
-        }
-
-        rule.runOnIdle {
-            assertThat(actualWindowSize.value).isEqualTo(MockWindowSize1)
-        }
-
-        mockWindowSize.value = MockWindowSize2
-
-        rule.runOnIdle {
-            assertThat(actualWindowSize.value).isEqualTo(MockWindowSize2)
-        }
-    }
-
-    companion object {
-        val MockWindowSize1 = IntSize(1000, 600)
-        val MockWindowSize2 = IntSize(800, 400)
-    }
-}
-
-internal class MockWindowMetricsCalculatorDecorator(
-    private val mockWindowSize: State<IntSize>
-) : WindowMetricsCalculatorDecorator {
-    override fun decorate(calculator: WindowMetricsCalculator): WindowMetricsCalculator {
-        return MockWindowMetricsCalculator(mockWindowSize)
-    }
-}
-
-internal class MockWindowMetricsCalculator(
-    private val mockWindowSize: State<IntSize>
-) : WindowMetricsCalculator {
-    override fun computeCurrentWindowMetrics(activity: Activity): WindowMetrics {
-        return WindowMetrics(
-            Rect(0, 0, mockWindowSize.value.width, mockWindowSize.value.height)
-        )
-    }
-
-    override fun computeMaximumWindowMetrics(activity: Activity): WindowMetrics {
-        return computeCurrentWindowMetrics(activity)
-    }
-
-    override fun computeCurrentWindowMetrics(@UiContext context: Context): WindowMetrics {
-        return WindowMetrics(
-            Rect(0, 0, mockWindowSize.value.width, mockWindowSize.value.height)
-        )
-    }
-}
diff --git a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidWindowInfo.android.kt b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidWindowInfo.android.kt
index a21a05e..5b7b34c 100644
--- a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidWindowInfo.android.kt
+++ b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidWindowInfo.android.kt
@@ -44,14 +44,14 @@
 @ExperimentalMaterial3AdaptiveApi
 @OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
 @Composable
-fun calculateWindowAdaptiveInfo(): WindowAdaptiveInfo =
+fun currentWindowAdaptiveInfo(): WindowAdaptiveInfo =
     WindowAdaptiveInfo(
         WindowSizeClass.calculateFromSize(
             with(LocalDensity.current) {
-                windowSizeAsState().value.toSize().toDpSize()
+                collectWindowSizeAsState().value.toSize().toDpSize()
             }
         ),
-        calculatePosture(foldingFeaturesAsState().value)
+        calculatePosture(collectFoldingFeaturesAsState().value)
     )
 
 /**
@@ -61,7 +61,7 @@
  */
 @ExperimentalMaterial3AdaptiveApi
 @Composable
-fun windowSizeAsState(): State<IntSize> {
+fun collectWindowSizeAsState(): State<IntSize> {
     val size = remember {
         mutableStateOf(IntSize(0, 0))
     }
@@ -90,7 +90,7 @@
  */
 @ExperimentalMaterial3AdaptiveApi
 @Composable
-fun foldingFeaturesAsState(): State<List<FoldingFeature>> {
+fun collectFoldingFeaturesAsState(): State<List<FoldingFeature>> {
     val context = LocalContext.current
     return remember(context) {
         if (context is Activity) {
diff --git a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/ListDetailPaneScaffold.kt b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/ListDetailPaneScaffold.kt
index b6c828e..b10a7bc 100644
--- a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/ListDetailPaneScaffold.kt
+++ b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/ListDetailPaneScaffold.kt
@@ -155,7 +155,7 @@
 @Composable
 fun rememberListDetailPaneScaffoldState(
     scaffoldDirective: PaneScaffoldDirective =
-        calculateStandardPaneScaffoldDirective(calculateWindowAdaptiveInfo()),
+        calculateStandardPaneScaffoldDirective(currentWindowAdaptiveInfo()),
     adaptStrategies: ThreePaneScaffoldAdaptStrategies =
         ListDetailPaneScaffoldDefaults.adaptStrategies(),
     initialFocusHistory: List<ListDetailPaneScaffoldRole> = listOf(ListDetailPaneScaffoldRole.List)
diff --git a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.android.kt b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.android.kt
index 97c0534..ce6c321 100644
--- a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.android.kt
+++ b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.android.kt
@@ -21,4 +21,4 @@
 @OptIn(ExperimentalMaterial3AdaptiveApi::class)
 internal actual val WindowAdaptiveInfoDefault: WindowAdaptiveInfo
     @Composable
-    get() = calculateWindowAdaptiveInfo()
+    get() = currentWindowAdaptiveInfo()
diff --git a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/SupportingPaneScaffold.kt b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/SupportingPaneScaffold.kt
index 1c0a80e..7e83cd7 100644
--- a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/SupportingPaneScaffold.kt
+++ b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/SupportingPaneScaffold.kt
@@ -140,7 +140,7 @@
 @Composable
 fun rememberSupportingPaneScaffoldState(
     scaffoldDirective: PaneScaffoldDirective =
-        calculateStandardPaneScaffoldDirective(calculateWindowAdaptiveInfo()),
+        calculateStandardPaneScaffoldDirective(currentWindowAdaptiveInfo()),
     adaptStrategies: ThreePaneScaffoldAdaptStrategies =
         SupportingPaneScaffoldDefaults.adaptStrategies(),
     initialFocusHistory: List<SupportingPaneScaffoldRole> = listOf(SupportingPaneScaffoldRole.Main)
diff --git a/compose/material3/material3-adaptive/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/PaneScaffoldDirectiveTest.kt b/compose/material3/material3-adaptive/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/PaneScaffoldDirectiveTest.kt
index 68c5553..505ccf9 100644
--- a/compose/material3/material3-adaptive/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/PaneScaffoldDirectiveTest.kt
+++ b/compose/material3/material3-adaptive/src/androidUnitTest/kotlin/androidx/compose/material3/adaptive/PaneScaffoldDirectiveTest.kt
@@ -20,6 +20,7 @@
 import androidx.compose.material3.windowsizeclass.WindowSizeClass
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -40,10 +41,20 @@
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(1)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
-        assertThat(scaffoldDirective.gutterSizes.outerVertical).isEqualTo(16.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerVertical).isEqualTo(0.dp)
-        assertThat(scaffoldDirective.gutterSizes.outerHorizontal).isEqualTo(16.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerHorizontal).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(LayoutDirection.Ltr)
+        ).isEqualTo(16.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(LayoutDirection.Ltr)
+        ).isEqualTo(16.dp)
+        assertThat(scaffoldDirective.gutterSizes.verticalSpacerSize).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding()
+        ).isEqualTo(16.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding()
+        ).isEqualTo(16.dp)
+        assertThat(scaffoldDirective.gutterSizes.horizontalSpacerSize).isEqualTo(0.dp)
     }
 
     @Test
@@ -57,10 +68,20 @@
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(1)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
-        assertThat(scaffoldDirective.gutterSizes.outerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerVertical).isEqualTo(0.dp)
-        assertThat(scaffoldDirective.gutterSizes.outerHorizontal).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerHorizontal).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.verticalSpacerSize).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding()
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding()
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.horizontalSpacerSize).isEqualTo(0.dp)
     }
 
     @Test
@@ -74,10 +95,20 @@
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(2)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
-        assertThat(scaffoldDirective.gutterSizes.outerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.outerHorizontal).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerHorizontal).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.verticalSpacerSize).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding()
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding()
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.horizontalSpacerSize).isEqualTo(0.dp)
     }
 
     @Test
@@ -91,10 +122,20 @@
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(1)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(2)
-        assertThat(scaffoldDirective.gutterSizes.outerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerVertical).isEqualTo(0.dp)
-        assertThat(scaffoldDirective.gutterSizes.outerHorizontal).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerHorizontal).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.verticalSpacerSize).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding()
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding()
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.horizontalSpacerSize).isEqualTo(24.dp)
     }
 
     @Test
@@ -108,10 +149,20 @@
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(1)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
-        assertThat(scaffoldDirective.gutterSizes.outerVertical).isEqualTo(16.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerVertical).isEqualTo(0.dp)
-        assertThat(scaffoldDirective.gutterSizes.outerHorizontal).isEqualTo(16.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerHorizontal).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(LayoutDirection.Ltr)
+        ).isEqualTo(16.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(LayoutDirection.Ltr)
+        ).isEqualTo(16.dp)
+        assertThat(scaffoldDirective.gutterSizes.verticalSpacerSize).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding()
+        ).isEqualTo(16.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding()
+        ).isEqualTo(16.dp)
+        assertThat(scaffoldDirective.gutterSizes.horizontalSpacerSize).isEqualTo(0.dp)
     }
 
     @Test
@@ -125,10 +176,20 @@
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(2)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
-        assertThat(scaffoldDirective.gutterSizes.outerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.outerHorizontal).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerHorizontal).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.verticalSpacerSize).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding()
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding()
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.horizontalSpacerSize).isEqualTo(0.dp)
     }
 
     @Test
@@ -142,10 +203,20 @@
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(2)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(1)
-        assertThat(scaffoldDirective.gutterSizes.outerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.outerHorizontal).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerHorizontal).isEqualTo(0.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.verticalSpacerSize).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding()
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding()
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.horizontalSpacerSize).isEqualTo(0.dp)
     }
 
     @Test
@@ -159,10 +230,20 @@
 
         assertThat(scaffoldDirective.maxHorizontalPartitions).isEqualTo(2)
         assertThat(scaffoldDirective.maxVerticalPartitions).isEqualTo(2)
-        assertThat(scaffoldDirective.gutterSizes.outerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerVertical).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.outerHorizontal).isEqualTo(24.dp)
-        assertThat(scaffoldDirective.gutterSizes.innerHorizontal).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(LayoutDirection.Ltr)
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.verticalSpacerSize).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding()
+        ).isEqualTo(24.dp)
+        assertThat(
+            scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding()
+        ).isEqualTo(24.dp)
+        assertThat(scaffoldDirective.gutterSizes.horizontalSpacerSize).isEqualTo(24.dp)
     }
 
     @Test
diff --git a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/PaneScaffold.kt b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/PaneScaffold.kt
index 6832d50..77310445 100644
--- a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/PaneScaffold.kt
+++ b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/PaneScaffold.kt
@@ -31,8 +31,10 @@
 @ExperimentalMaterial3AdaptiveApi
 interface PaneScaffoldScope {
     /**
-     * Specify the preferred width of the pane. The relevant pane scaffold implementations are
-     * supposed to respect the preferred width of a pane whenever it's possible.
+     * This modifier specifies the preferred width for a pane, and the pane scaffold implementation
+     * will respect this width whenever possible. In case the modifier is not set or set to
+     * [Dp.Unspecified], the default preferred widths of the respective scaffold implementation will
+     * be used.
      */
     fun Modifier.preferredWidth(width: Dp): Modifier
 }
diff --git a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/PaneScaffoldDirective.kt b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/PaneScaffoldDirective.kt
index ca23073..4c88e8d 100644
--- a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/PaneScaffoldDirective.kt
+++ b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/PaneScaffoldDirective.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.material3.adaptive
 
+import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
 import androidx.compose.runtime.Immutable
 import androidx.compose.ui.geometry.Rect
@@ -42,42 +43,40 @@
     hingePolicy: HingePolicy = HingePolicy.AvoidSeparating
 ): PaneScaffoldDirective {
     val maxHorizontalPartitions: Int
-    val gutterOuterVertical: Dp
-    val gutterInnerVertical: Dp
+    val contentPadding: PaddingValues
+    val verticalSpacerSize: Dp
     when (windowAdaptiveInfo.windowSizeClass.widthSizeClass) {
         WindowWidthSizeClass.Compact -> {
             maxHorizontalPartitions = 1
-            gutterOuterVertical = 16.dp
-            gutterInnerVertical = 0.dp
+            contentPadding = PaddingValues(16.dp)
+            verticalSpacerSize = 0.dp
         }
         WindowWidthSizeClass.Medium -> {
             maxHorizontalPartitions = 1
-            gutterOuterVertical = 24.dp
-            gutterInnerVertical = 0.dp
+            contentPadding = PaddingValues(24.dp)
+            verticalSpacerSize = 0.dp
         }
         else -> {
             maxHorizontalPartitions = 2
-            gutterOuterVertical = 24.dp
-            gutterInnerVertical = 24.dp
+            contentPadding = PaddingValues(24.dp)
+            verticalSpacerSize = 24.dp
         }
     }
     val maxVerticalPartitions: Int
-    val gutterInnerHorizontal: Dp
+    val horizontalSpacerSize: Dp
 
     // TODO(conradchen): Confirm the table top mode settings
     if (windowAdaptiveInfo.posture.isTabletop) {
         maxVerticalPartitions = 2
-        gutterInnerHorizontal = 24.dp
+        horizontalSpacerSize = 24.dp
     } else {
         maxVerticalPartitions = 1
-        gutterInnerHorizontal = 0.dp
+        horizontalSpacerSize = 0.dp
     }
 
     return PaneScaffoldDirective(
         maxHorizontalPartitions,
-        GutterSizes(
-            gutterOuterVertical, gutterInnerVertical, innerHorizontal = gutterInnerHorizontal
-        ),
+        GutterSizes(contentPadding, verticalSpacerSize, horizontalSpacerSize),
         maxVerticalPartitions,
         getExcludedBounds(windowAdaptiveInfo.posture, hingePolicy)
     )
@@ -103,42 +102,40 @@
     hingePolicy: HingePolicy = HingePolicy.AvoidSeparating
 ): PaneScaffoldDirective {
     val maxHorizontalPartitions: Int
-    val gutterOuterVertical: Dp
-    val gutterInnerVertical: Dp
+    val contentPadding: PaddingValues
+    val verticalSpacerSize: Dp
     when (windowAdaptiveInfo.windowSizeClass.widthSizeClass) {
         WindowWidthSizeClass.Compact -> {
             maxHorizontalPartitions = 1
-            gutterOuterVertical = 16.dp
-            gutterInnerVertical = 0.dp
+            contentPadding = PaddingValues(16.dp)
+            verticalSpacerSize = 0.dp
         }
         WindowWidthSizeClass.Medium -> {
             // TODO(conradchen): Confirm the outer gutter size
             maxHorizontalPartitions = 2
-            gutterOuterVertical = 24.dp
-            gutterInnerVertical = 24.dp
+            contentPadding = PaddingValues(24.dp)
+            verticalSpacerSize = 24.dp
         }
         else -> {
             maxHorizontalPartitions = 2
-            gutterOuterVertical = 24.dp
-            gutterInnerVertical = 24.dp
+            contentPadding = PaddingValues(24.dp)
+            verticalSpacerSize = 24.dp
         }
     }
     val maxVerticalPartitions: Int
-    val gutterInnerHorizontal: Dp
+    val horizontalSpacerSize: Dp
 
     if (windowAdaptiveInfo.posture.isTabletop) {
         maxVerticalPartitions = 2
-        gutterInnerHorizontal = 24.dp
+        horizontalSpacerSize = 24.dp
     } else {
         maxVerticalPartitions = 1
-        gutterInnerHorizontal = 0.dp
+        horizontalSpacerSize = 0.dp
     }
 
     return PaneScaffoldDirective(
         maxHorizontalPartitions,
-        GutterSizes(
-            gutterOuterVertical, gutterInnerVertical, innerHorizontal = gutterInnerHorizontal
-        ),
+        GutterSizes(contentPadding, verticalSpacerSize, horizontalSpacerSize),
         maxVerticalPartitions,
         getExcludedBounds(windowAdaptiveInfo.posture, hingePolicy)
     )
@@ -193,44 +190,38 @@
 }
 
 /**
- * Denotes the gutter sizes of an adaptive layout. Gutters of an adaptive layouts include margins
- * between panes ([innerVertical] and [innerHorizontal]) and paddings of the layout itself
- * ([outerVertical] and [outerHorizontal]). Usually we will expect larger gutter sizes to be set
- * when the layout is larger and more panes are shown in the layout.
+ * Denotes the gutter sizes of an adaptive layout. Gutters of an adaptive layouts include spacers
+ * between panes ([verticalSpacerSize] and [horizontalSpacerSize]) and paddings of the layout itself
+ * ([contentPadding]). Usually we will expect larger gutter sizes to be set when the layout is
+ * larger and more panes are shown in the layout.
  *
  * @constructor create an instance of [GutterSizes]
- * @param outerVertical Size of the outer vertical gutters. It's similar to left/right paddings of
- *        a normal layout.
- * @param innerVertical Size of the inner vertical gutters. It's similar to left/right margins of
- *        the layout's children.
- * @param outerHorizontal Size of the outer horizontal gutters. It's similar to top/bottom paddings
- *        of a normal layout.
- * @param innerHorizontal Size of the inner horizontal gutters. It's similar to top/bottom margins
- *        of the layout's children.
+ * @param contentPadding Size of the paddings between the panes and the outer bounds of the layout.
+ * @param verticalSpacerSize Size of the vertical spacers between panes. It's similar to left/right
+ *        margins of the layout's children.
+ * @param horizontalSpacerSize Size of the horizontal spacers between panes. It's similar to
+ *        top/bottom margins of the layout's children.
  */
 @ExperimentalMaterial3AdaptiveApi
 @Immutable
 class GutterSizes(
-    val outerVertical: Dp,
-    val innerVertical: Dp,
-    val outerHorizontal: Dp = outerVertical,
-    val innerHorizontal: Dp = innerVertical
+    val contentPadding: PaddingValues,
+    val verticalSpacerSize: Dp,
+    val horizontalSpacerSize: Dp = verticalSpacerSize
 ) {
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is GutterSizes) return false
-        if (outerVertical != other.outerVertical) return false
-        if (innerVertical != other.innerVertical) return false
-        if (outerHorizontal != other.outerHorizontal) return false
-        if (innerHorizontal != other.innerHorizontal) return false
+        if (contentPadding != other.contentPadding) return false
+        if (verticalSpacerSize != other.verticalSpacerSize) return false
+        if (horizontalSpacerSize != other.horizontalSpacerSize) return false
         return true
     }
 
     override fun hashCode(): Int {
-        var result = outerVertical.hashCode()
-        result = 31 * result + innerVertical.hashCode()
-        result = 31 * result + outerHorizontal.hashCode()
-        result = 31 * result + innerHorizontal.hashCode()
+        var result = contentPadding.hashCode()
+        result = 31 * result + verticalSpacerSize.hashCode()
+        result = 31 * result + horizontalSpacerSize.hashCode()
         return result
     }
 }
diff --git a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
index 7f553a9..d9bedb5 100644
--- a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
+++ b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
@@ -41,6 +41,7 @@
 import androidx.compose.ui.layout.MultiContentMeasurePolicy
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.layout.boundsInWindow
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntRect
@@ -84,11 +85,15 @@
     tertiaryPane: (@Composable ThreePaneScaffoldScope.() -> Unit)? = null,
     primaryPane: @Composable ThreePaneScaffoldScope.() -> Unit,
 ) {
+    val layoutDirection = LocalLayoutDirection.current
+    val ltrArrangement = remember(arrangement, layoutDirection) {
+        arrangement.toLtrArrangement(layoutDirection)
+    }
     val previousScaffoldValue = remember { ThreePaneScaffoldValueHolder(scaffoldValue) }
     val paneMotion = calculateThreePaneMotion(
-        previousScaffoldValue.value,
-        scaffoldValue,
-        arrangement
+        previousScaffoldValue = previousScaffoldValue.value,
+        currentScaffoldValue = scaffoldValue,
+        arrangement = ltrArrangement
     )
     previousScaffoldValue.value = scaffoldValue
 
@@ -101,11 +106,11 @@
                 positionAnimationSpec = paneMotion.animationSpec
                 enterTransition = paneMotion.enterTransition(
                     ThreePaneScaffoldRole.Primary,
-                    arrangement
+                    ltrArrangement
                 )
                 exitTransition = paneMotion.exitTransition(
                     ThreePaneScaffoldRole.Primary,
-                    arrangement
+                    ltrArrangement
                 )
                 animationToolingLabel = "Primary"
             }.primaryPane()
@@ -116,11 +121,11 @@
                 positionAnimationSpec = paneMotion.animationSpec
                 enterTransition = paneMotion.enterTransition(
                     ThreePaneScaffoldRole.Secondary,
-                    arrangement
+                    ltrArrangement
                 )
                 exitTransition = paneMotion.exitTransition(
                     ThreePaneScaffoldRole.Secondary,
-                    arrangement
+                    ltrArrangement
                 )
                 animationToolingLabel = "Secondary"
             }.secondaryPane()
@@ -132,11 +137,11 @@
                     positionAnimationSpec = paneMotion.animationSpec
                     enterTransition = paneMotion.enterTransition(
                         ThreePaneScaffoldRole.Tertiary,
-                        arrangement
+                        ltrArrangement
                     )
                     exitTransition = paneMotion.exitTransition(
                         ThreePaneScaffoldRole.Tertiary,
-                        arrangement
+                        ltrArrangement
                     )
                     animationToolingLabel = "Tertiary"
                 }.tertiaryPane()
@@ -145,10 +150,10 @@
     )
 
     val measurePolicy =
-        remember { ThreePaneContentMeasurePolicy(scaffoldDirective, scaffoldValue, arrangement) }
+        remember { ThreePaneContentMeasurePolicy(scaffoldDirective, scaffoldValue, ltrArrangement) }
     measurePolicy.scaffoldDirective = scaffoldDirective
     measurePolicy.scaffoldValue = scaffoldValue
-    measurePolicy.arrangement = arrangement
+    measurePolicy.arrangement = ltrArrangement
 
     LookaheadScope {
         Layout(
@@ -289,9 +294,13 @@
                 ThreePaneScaffoldDefaults.panesRightMotion
             }
 
+            previousScaffoldValue[arrangement.secondPane] != PaneAdaptedValue.Expanded &&
+                currentScaffoldValue[arrangement.firstPane] != PaneAdaptedValue.Expanded -> {
+                ThreePaneScaffoldDefaults.replaceLeftPaneMotion
+            }
+
             else -> {
-                // TODO(conradchen): Address this case when we need to support supporting pane
-                ThreePaneMotion.NoMotion
+                ThreePaneScaffoldDefaults.replaceRightPaneMotion
             }
         }
 
@@ -367,24 +376,33 @@
                 it == PaneAdaptedValue.Hidden
             }
 
-            val outerVerticalGutterSize = scaffoldDirective.gutterSizes.outerVertical.roundToPx()
-            val innerVerticalGutterSize = scaffoldDirective.gutterSizes.innerVertical.roundToPx()
-            val outerHorizontalGutterSize =
-                scaffoldDirective.gutterSizes.outerHorizontal.roundToPx()
+            val verticalSpacerSize = scaffoldDirective.gutterSizes.verticalSpacerSize.roundToPx()
+            val leftContentPadding =
+                scaffoldDirective.gutterSizes.contentPadding.calculateLeftPadding(
+                    layoutDirection
+                ).roundToPx()
+            val rightContentPadding =
+                scaffoldDirective.gutterSizes.contentPadding.calculateRightPadding(
+                    layoutDirection
+                ).roundToPx()
+            val topContentPadding =
+                scaffoldDirective.gutterSizes.contentPadding.calculateTopPadding().roundToPx()
+            val bottomContentPadding =
+                scaffoldDirective.gutterSizes.contentPadding.calculateBottomPadding().roundToPx()
             val outerBounds = IntRect(
-                outerVerticalGutterSize,
-                outerHorizontalGutterSize,
-                constraints.maxWidth - outerVerticalGutterSize,
-                constraints.maxHeight - outerHorizontalGutterSize
+                leftContentPadding,
+                topContentPadding,
+                constraints.maxWidth - rightContentPadding,
+                constraints.maxHeight - bottomContentPadding
             )
 
             if (scaffoldDirective.excludedBounds.isNotEmpty()) {
                 val layoutBounds = coordinates!!.boundsInWindow()
                 val layoutPhysicalPartitions = mutableListOf<Rect>()
-                var actualLeft = layoutBounds.left + outerVerticalGutterSize
-                var actualRight = layoutBounds.right - outerVerticalGutterSize
-                val actualTop = layoutBounds.top + outerHorizontalGutterSize
-                val actualBottom = layoutBounds.bottom - outerHorizontalGutterSize
+                var actualLeft = layoutBounds.left + leftContentPadding
+                var actualRight = layoutBounds.right - rightContentPadding
+                val actualTop = layoutBounds.top + topContentPadding
+                val actualBottom = layoutBounds.bottom - bottomContentPadding
                 // Assume hinge bounds are sorted from left to right, non-overlapped.
                 scaffoldDirective.excludedBounds.fastForEach { hingeBound ->
                     if (hingeBound.left <= actualLeft) {
@@ -405,7 +423,7 @@
                             Rect(actualLeft, actualTop, hingeBound.left, actualBottom)
                         )
                         actualLeft +=
-                            max(hingeBound.right, hingeBound.left + innerVerticalGutterSize)
+                            max(hingeBound.right, hingeBound.left + verticalSpacerSize)
                     }
                 }
                 if (actualLeft < actualRight) {
@@ -419,7 +437,7 @@
                 } else if (layoutPhysicalPartitions.size == 1) {
                     measureAndPlacePanes(
                         layoutPhysicalPartitions[0],
-                        innerVerticalGutterSize,
+                        verticalSpacerSize,
                         visiblePanes,
                         isLookingAhead
                     )
@@ -430,7 +448,7 @@
                     if (layoutPhysicalPartitions[0].width > layoutPhysicalPartitions[1].width) {
                         measureAndPlacePanes(
                             layoutPhysicalPartitions[0],
-                            innerVerticalGutterSize,
+                            verticalSpacerSize,
                             visiblePanes.subList(0, 2),
                             isLookingAhead
                         )
@@ -447,7 +465,7 @@
                         )
                         measureAndPlacePanes(
                             layoutPhysicalPartitions[1],
-                            innerVerticalGutterSize,
+                            verticalSpacerSize,
                             visiblePanes.subList(1, 3),
                             isLookingAhead
                         )
@@ -465,7 +483,7 @@
             } else {
                 measureAndPlacePanesWithLocalBounds(
                     outerBounds,
-                    innerVerticalGutterSize,
+                    verticalSpacerSize,
                     visiblePanes,
                     isLookingAhead
                 )
@@ -703,11 +721,10 @@
 ) : Measurable by measurable {
     private val data = ((parentData as? PaneScaffoldParentData) ?: PaneScaffoldParentData())
 
-    // TODO(conradchen): Handle the case of a low priority pane with no preferred with
-    var measuredWidth = when (data.preferredWidth) {
-        null -> defaultPreferredWidth
-        Float.NaN -> 0
-        else -> data.preferredWidth!!.toInt()
+    var measuredWidth = if (data.preferredWidth == null || data.preferredWidth!!.isNaN()) {
+        defaultPreferredWidth
+    } else {
+        data.preferredWidth!!.toInt()
     }
 }
 
@@ -855,4 +872,26 @@
         slideInFromRight,
         slideOutToLeft
     )
+
+    // TODO(conradchen): figure out how to add delay and zOffset to spring animations
+    internal val replaceLeftPaneMotion = ThreePaneMotion(
+        PaneSpringSpec,
+        slideInFromLeft,
+        slideOutToLeft,
+        slideInFromLeft,
+        slideOutToLeft,
+        EnterTransition.None,
+        ExitTransition.None
+    )
+
+    // TODO(conradchen): figure out how to add delay and zOffset to spring animations
+    internal val replaceRightPaneMotion = ThreePaneMotion(
+        PaneSpringSpec,
+        EnterTransition.None,
+        ExitTransition.None,
+        slideInFromRight,
+        slideOutToRight,
+        slideInFromRight,
+        slideOutToRight
+    )
 }
diff --git a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldArrangement.kt b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldArrangement.kt
index f472d0a..929ca2e 100644
--- a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldArrangement.kt
+++ b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldArrangement.kt
@@ -17,6 +17,7 @@
 package androidx.compose.material3.adaptive
 
 import androidx.compose.runtime.Immutable
+import androidx.compose.ui.unit.LayoutDirection
 
 /**
  * Represents the pane order of [ThreePaneScaffold] from start to end. Note that the values of
@@ -59,8 +60,28 @@
     }
 }
 
+/**
+ * Converts a bidirectional arrangement to a left-to-right arrangement.
+ */
 @ExperimentalMaterial3AdaptiveApi
-internal inline fun ThreePaneScaffoldArrangement.forEach(action: (ThreePaneScaffoldRole) -> Unit) {
+internal fun ThreePaneScaffoldArrangement.toLtrArrangement(
+    layoutDirection: LayoutDirection
+): ThreePaneScaffoldArrangement {
+    return if (layoutDirection == LayoutDirection.Rtl) {
+        ThreePaneScaffoldArrangement(
+            thirdPane,
+            secondPane,
+            firstPane
+        )
+    } else {
+        this
+    }
+}
+
+@ExperimentalMaterial3AdaptiveApi
+internal inline fun ThreePaneScaffoldArrangement.forEach(
+    action: (ThreePaneScaffoldRole) -> Unit
+) {
     action(firstPane)
     action(secondPane)
     action(thirdPane)
diff --git a/compose/material3/material3-window-size-class/lint-baseline.xml b/compose/material3/material3-window-size-class/lint-baseline.xml
index 41ded8f..4f32419 100644
--- a/compose/material3/material3-window-size-class/lint-baseline.xml
+++ b/compose/material3/material3-window-size-class/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-beta01" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-beta01)" variant="all" version="8.2.0-beta01">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="PrimitiveInCollection"
@@ -21,33 +21,6 @@
 
     <issue
         id="PrimitiveInCollection"
-        message="field DefaultSizeClasses with type Set&lt;WindowWidthSizeClass>: replace with IntSet"
-        errorLine1="        /**"
-        errorLine2="        ^">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Set&lt;WindowWidthSizeClass> of getDefaultSizeClasses: replace with IntSet"
-        errorLine1="        val DefaultSizeClasses = setOf(Compact, Medium, Expanded)"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Set&lt;WindowWidthSizeClass> of getStandardSizeClasses: replace with IntSet"
-        errorLine1="        val StandardSizeClasses get() = DefaultSizeClasses"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
         message="method fromWidth$lint_module has parameter supportedSizeClasses with type Set&lt;WindowWidthSizeClass>: replace with IntSet"
         errorLine1="            supportedSizeClasses: Set&lt;WindowWidthSizeClass>"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -57,42 +30,6 @@
 
     <issue
         id="PrimitiveInCollection"
-        message="variable sortedSizeClasses with type List&lt;? extends WindowWidthSizeClass>: replace with IntList"
-        errorLine1="            val sortedSizeClasses = supportedSizeClasses.sortedDescending()"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field DefaultSizeClasses with type Set&lt;WindowHeightSizeClass>: replace with IntSet"
-        errorLine1="        /**"
-        errorLine2="        ^">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Set&lt;WindowHeightSizeClass> of getDefaultSizeClasses: replace with IntSet"
-        errorLine1="        val DefaultSizeClasses = setOf(Compact, Medium, Expanded)"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Set&lt;WindowHeightSizeClass> of getStandardSizeClasses: replace with IntSet"
-        errorLine1="        val StandardSizeClasses get() = DefaultSizeClasses"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
         message="method fromHeight$lint_module has parameter supportedSizeClasses with type Set&lt;WindowHeightSizeClass>: replace with IntSet"
         errorLine1="            supportedSizeClasses: Set&lt;WindowHeightSizeClass>"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -100,13 +37,4 @@
             file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
     </issue>
 
-    <issue
-        id="PrimitiveInCollection"
-        message="variable sortedSizeClasses with type List&lt;? extends WindowHeightSizeClass>: replace with IntList"
-        errorLine1="            val sortedSizeClasses = supportedSizeClasses.sortedDescending()"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
-    </issue>
-
 </issues>
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index 0e813f2..d3d452c 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -257,11 +257,11 @@
 
   public final class CardKt {
     method @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void ElevatedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ElevatedCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void OutlinedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void OutlinedCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Immutable public final class CheckboxColors {
@@ -331,10 +331,10 @@
   public final class ChipKt {
     method @androidx.compose.runtime.Composable public static void AssistChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void ElevatedAssistChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedFilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void ElevatedFilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void ElevatedSuggestionChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void FilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void InputChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? avatar, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void FilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void InputChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? avatar, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void SuggestionChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
@@ -732,7 +732,7 @@
     property public final int Start;
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class FilterChipDefaults {
+  public final class FilterChipDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipColors elevatedFilterChipColors(optional long containerColor, optional long labelColor, optional long iconColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor, optional long selectedContainerColor, optional long disabledSelectedContainerColor, optional long selectedLabelColor, optional long selectedLeadingIconColor, optional long selectedTrailingIconColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipElevation elevatedFilterChipElevation(optional float elevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipBorder filterChipBorder(optional long borderColor, optional long selectedBorderColor, optional long disabledBorderColor, optional long disabledSelectedBorderColor, optional float borderWidth, optional float selectedBorderWidth);
@@ -855,7 +855,7 @@
     property public final long disabledContentColor;
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class InputChipDefaults {
+  public final class InputChipDefaults {
     method public float getAvatarSize();
     method public float getHeight();
     method public float getIconSize();
@@ -1289,14 +1289,14 @@
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SingleChoiceSegmentedButtonRow(optional androidx.compose.ui.Modifier modifier, optional float space, kotlin.jvm.functions.Function1<? super androidx.compose.material3.SingleChoiceSegmentedButtonRowScope,kotlin.Unit> content);
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipBorder {
+  @androidx.compose.runtime.Immutable public final class SelectableChipBorder {
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipColors {
+  @androidx.compose.runtime.Immutable public final class SelectableChipColors {
     ctor public SelectableChipColors(long containerColor, long labelColor, long leadingIconColor, long trailingIconColor, long disabledContainerColor, long disabledLabelColor, long disabledLeadingIconColor, long disabledTrailingIconColor, long selectedContainerColor, long disabledSelectedContainerColor, long selectedLabelColor, long selectedLeadingIconColor, long selectedTrailingIconColor);
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipElevation {
+  @androidx.compose.runtime.Immutable public final class SelectableChipElevation {
     method public float getDisabledElevation();
     method public float getDraggedElevation();
     method public float getElevation();
@@ -1883,18 +1883,18 @@
   }
 
   public final class TooltipKt {
-    method @androidx.compose.runtime.Composable public static void PlainTooltip(optional androidx.compose.ui.Modifier modifier, optional long contentColor, optional long containerColor, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PlainTooltipBox(kotlin.jvm.functions.Function0<kotlin.Unit> tooltip, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional androidx.compose.material3.PlainTooltipState tooltipState, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.material3.TooltipBoxScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void RichTooltip(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional androidx.compose.material3.RichTooltipColors colors, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RichTooltipBox(kotlin.jvm.functions.Function0<kotlin.Unit> text, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional androidx.compose.material3.RichTooltipState tooltipState, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.RichTooltipColors colors, kotlin.jvm.functions.Function1<? super androidx.compose.material3.TooltipBoxScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void TooltipBox(androidx.compose.ui.window.PopupPositionProvider positionProvider, kotlin.jvm.functions.Function0<kotlin.Unit> tooltip, androidx.compose.material3.TooltipState state, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional boolean enableUserInput, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static androidx.compose.material3.TooltipState TooltipState(optional boolean initialIsVisible, optional boolean isPersistent, optional androidx.compose.foundation.MutatorMutex mutatorMutex);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PlainTooltip(optional androidx.compose.ui.Modifier modifier, optional long contentColor, optional long containerColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PlainTooltipBox(kotlin.jvm.functions.Function0<kotlin.Unit> tooltip, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional androidx.compose.material3.PlainTooltipState tooltipState, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional float tonalElevation, optional float shadowElevation, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.material3.TooltipBoxScope,kotlin.Unit> content);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RichTooltip(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional androidx.compose.material3.RichTooltipColors colors, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RichTooltipBox(kotlin.jvm.functions.Function0<kotlin.Unit> text, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional androidx.compose.material3.RichTooltipState tooltipState, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.RichTooltipColors colors, optional float tonalElevation, optional float shadowElevation, kotlin.jvm.functions.Function1<? super androidx.compose.material3.TooltipBoxScope,kotlin.Unit> content);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void TooltipBox(androidx.compose.ui.window.PopupPositionProvider positionProvider, kotlin.jvm.functions.Function0<kotlin.Unit> tooltip, androidx.compose.material3.TooltipState state, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional boolean enableUserInput, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.material3.TooltipState TooltipState(optional boolean initialIsVisible, optional boolean isPersistent, optional androidx.compose.foundation.MutatorMutex mutatorMutex);
     method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.PlainTooltipState rememberPlainTooltipState(optional androidx.compose.foundation.MutatorMutex mutatorMutex);
     method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.RichTooltipState rememberRichTooltipState(boolean isPersistent, optional androidx.compose.foundation.MutatorMutex mutatorMutex);
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.TooltipState rememberTooltipState(optional boolean initialIsVisible, optional boolean isPersistent, optional androidx.compose.foundation.MutatorMutex mutatorMutex);
   }
 
-  public interface TooltipState extends androidx.compose.foundation.BasicTooltipState {
+  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public interface TooltipState extends androidx.compose.foundation.BasicTooltipState {
     method public androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> getTransition();
     property public abstract androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> transition;
   }
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index 0e813f2..d3d452c 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -257,11 +257,11 @@
 
   public final class CardKt {
     method @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void ElevatedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ElevatedCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void OutlinedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void OutlinedCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.CardColors colors, optional androidx.compose.material3.CardElevation elevation, optional androidx.compose.foundation.BorderStroke border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Immutable public final class CheckboxColors {
@@ -331,10 +331,10 @@
   public final class ChipKt {
     method @androidx.compose.runtime.Composable public static void AssistChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void ElevatedAssistChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedFilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void ElevatedFilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void ElevatedSuggestionChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void FilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void InputChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? avatar, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void FilterChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void InputChip(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? avatar, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.SelectableChipColors colors, optional androidx.compose.material3.SelectableChipElevation? elevation, optional androidx.compose.material3.SelectableChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.runtime.Composable public static void SuggestionChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> label, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.ChipColors colors, optional androidx.compose.material3.ChipElevation? elevation, optional androidx.compose.material3.ChipBorder? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
   }
 
@@ -732,7 +732,7 @@
     property public final int Start;
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class FilterChipDefaults {
+  public final class FilterChipDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipColors elevatedFilterChipColors(optional long containerColor, optional long labelColor, optional long iconColor, optional long disabledContainerColor, optional long disabledLabelColor, optional long disabledLeadingIconColor, optional long disabledTrailingIconColor, optional long selectedContainerColor, optional long disabledSelectedContainerColor, optional long selectedLabelColor, optional long selectedLeadingIconColor, optional long selectedTrailingIconColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipElevation elevatedFilterChipElevation(optional float elevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation, optional float disabledElevation);
     method @androidx.compose.runtime.Composable public androidx.compose.material3.SelectableChipBorder filterChipBorder(optional long borderColor, optional long selectedBorderColor, optional long disabledBorderColor, optional long disabledSelectedBorderColor, optional float borderWidth, optional float selectedBorderWidth);
@@ -855,7 +855,7 @@
     property public final long disabledContentColor;
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class InputChipDefaults {
+  public final class InputChipDefaults {
     method public float getAvatarSize();
     method public float getHeight();
     method public float getIconSize();
@@ -1289,14 +1289,14 @@
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void SingleChoiceSegmentedButtonRow(optional androidx.compose.ui.Modifier modifier, optional float space, kotlin.jvm.functions.Function1<? super androidx.compose.material3.SingleChoiceSegmentedButtonRowScope,kotlin.Unit> content);
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipBorder {
+  @androidx.compose.runtime.Immutable public final class SelectableChipBorder {
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipColors {
+  @androidx.compose.runtime.Immutable public final class SelectableChipColors {
     ctor public SelectableChipColors(long containerColor, long labelColor, long leadingIconColor, long trailingIconColor, long disabledContainerColor, long disabledLabelColor, long disabledLeadingIconColor, long disabledTrailingIconColor, long selectedContainerColor, long disabledSelectedContainerColor, long selectedLabelColor, long selectedLeadingIconColor, long selectedTrailingIconColor);
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Immutable public final class SelectableChipElevation {
+  @androidx.compose.runtime.Immutable public final class SelectableChipElevation {
     method public float getDisabledElevation();
     method public float getDraggedElevation();
     method public float getElevation();
@@ -1883,18 +1883,18 @@
   }
 
   public final class TooltipKt {
-    method @androidx.compose.runtime.Composable public static void PlainTooltip(optional androidx.compose.ui.Modifier modifier, optional long contentColor, optional long containerColor, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PlainTooltipBox(kotlin.jvm.functions.Function0<kotlin.Unit> tooltip, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional androidx.compose.material3.PlainTooltipState tooltipState, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.material3.TooltipBoxScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void RichTooltip(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional androidx.compose.material3.RichTooltipColors colors, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> text);
-    method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RichTooltipBox(kotlin.jvm.functions.Function0<kotlin.Unit> text, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional androidx.compose.material3.RichTooltipState tooltipState, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.RichTooltipColors colors, kotlin.jvm.functions.Function1<? super androidx.compose.material3.TooltipBoxScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void TooltipBox(androidx.compose.ui.window.PopupPositionProvider positionProvider, kotlin.jvm.functions.Function0<kotlin.Unit> tooltip, androidx.compose.material3.TooltipState state, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional boolean enableUserInput, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method public static androidx.compose.material3.TooltipState TooltipState(optional boolean initialIsVisible, optional boolean isPersistent, optional androidx.compose.foundation.MutatorMutex mutatorMutex);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PlainTooltip(optional androidx.compose.ui.Modifier modifier, optional long contentColor, optional long containerColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PlainTooltipBox(kotlin.jvm.functions.Function0<kotlin.Unit> tooltip, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional androidx.compose.material3.PlainTooltipState tooltipState, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional float tonalElevation, optional float shadowElevation, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.material3.TooltipBoxScope,kotlin.Unit> content);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RichTooltip(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional androidx.compose.material3.RichTooltipColors colors, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+    method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void RichTooltipBox(kotlin.jvm.functions.Function0<kotlin.Unit> text, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional androidx.compose.material3.RichTooltipState tooltipState, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.RichTooltipColors colors, optional float tonalElevation, optional float shadowElevation, kotlin.jvm.functions.Function1<? super androidx.compose.material3.TooltipBoxScope,kotlin.Unit> content);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void TooltipBox(androidx.compose.ui.window.PopupPositionProvider positionProvider, kotlin.jvm.functions.Function0<kotlin.Unit> tooltip, androidx.compose.material3.TooltipState state, optional androidx.compose.ui.Modifier modifier, optional boolean focusable, optional boolean enableUserInput, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.material3.TooltipState TooltipState(optional boolean initialIsVisible, optional boolean isPersistent, optional androidx.compose.foundation.MutatorMutex mutatorMutex);
     method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.PlainTooltipState rememberPlainTooltipState(optional androidx.compose.foundation.MutatorMutex mutatorMutex);
     method @Deprecated @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.RichTooltipState rememberRichTooltipState(boolean isPersistent, optional androidx.compose.foundation.MutatorMutex mutatorMutex);
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.TooltipState rememberTooltipState(optional boolean initialIsVisible, optional boolean isPersistent, optional androidx.compose.foundation.MutatorMutex mutatorMutex);
   }
 
-  public interface TooltipState extends androidx.compose.foundation.BasicTooltipState {
+  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public interface TooltipState extends androidx.compose.foundation.BasicTooltipState {
     method public androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> getTransition();
     property public abstract androidx.compose.animation.core.MutableTransitionState<java.lang.Boolean> transition;
   }
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/ComponentItem.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/ComponentItem.kt
index d5b0b77..48f72a0 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/ComponentItem.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/ComponentItem.kt
@@ -22,7 +22,6 @@
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
-import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.LocalContentColor
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.OutlinedCard
@@ -36,7 +35,6 @@
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.unit.dp
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun ComponentItem(
     component: Component,
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/ExampleItem.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/ExampleItem.kt
index f9721e6..00c1f42 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/ExampleItem.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/example/ExampleItem.kt
@@ -25,7 +25,6 @@
 import androidx.compose.foundation.layout.width
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
-import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.OutlinedCard
@@ -36,7 +35,6 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun ExampleItem(
     example: Example,
diff --git a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TooltipDemo.kt b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TooltipDemo.kt
index 4a9b04d..be8dbb0 100644
--- a/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TooltipDemo.kt
+++ b/compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/TooltipDemo.kt
@@ -164,6 +164,7 @@
     }
 }
 
+@OptIn(ExperimentalMaterial3Api::class)
 class ItemInfo(
     val itemName: String,
     val addedTooltipState: TooltipState
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt
index 06ec04f..104c8fc 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt
@@ -22,7 +22,6 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.material3.Card
 import androidx.compose.material3.ElevatedCard
-import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.OutlinedCard
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
@@ -40,7 +39,6 @@
     }
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Sampled
 @Composable
@@ -64,7 +62,6 @@
     }
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Sampled
 @Composable
@@ -88,7 +85,6 @@
     }
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Sampled
 @Composable
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ChipSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ChipSamples.kt
index bd22dc0..14e42de 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ChipSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ChipSamples.kt
@@ -38,7 +38,6 @@
 import androidx.compose.material3.ElevatedAssistChip
 import androidx.compose.material3.ElevatedFilterChip
 import androidx.compose.material3.ElevatedSuggestionChip
-import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.FilterChip
 import androidx.compose.material3.FilterChipDefaults
 import androidx.compose.material3.Icon
@@ -90,7 +89,6 @@
     )
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Sampled
 @Composable
@@ -114,7 +112,6 @@
     )
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Sampled
 @Composable
@@ -138,7 +135,6 @@
     )
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Sampled
 @Composable
@@ -168,7 +164,6 @@
     )
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Sampled
 @Composable
@@ -181,7 +176,6 @@
     )
 }
 
-@OptIn(ExperimentalMaterial3Api::class)
 @Preview
 @Sampled
 @Composable
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
index c95c2ba..077cb6d 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardScreenshotTest.kt
@@ -49,7 +49,6 @@
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-@OptIn(ExperimentalMaterial3Api::class)
 class CardScreenshotTest {
 
     @get:Rule
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
index d2869ed..975def3 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/CardTest.kt
@@ -58,7 +58,6 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-@OptIn(ExperimentalMaterial3Api::class)
 class CardTest {
 
     @get:Rule
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipScreenshotTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipScreenshotTest.kt
index 2df1372..490353b 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipScreenshotTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipScreenshotTest.kt
@@ -39,7 +39,6 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-@OptIn(ExperimentalMaterial3Api::class)
 class ChipScreenshotTest {
 
     @get:Rule
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipTest.kt
index 697685b9..7a5b2f7 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ChipTest.kt
@@ -92,7 +92,6 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-@OptIn(ExperimentalMaterial3Api::class)
 class ChipTest {
     @get:Rule
     val rule = createComposeRule()
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExposedDropdownMenuTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExposedDropdownMenuTest.kt
index f765c01..0ebdf52 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExposedDropdownMenuTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ExposedDropdownMenuTest.kt
@@ -559,7 +559,7 @@
             ExposedDropdownMenuBox(
                 modifier = Modifier.align(Alignment.Center),
                 expanded = expanded,
-                onExpandedChange = { onExpandChange(!expanded) }
+                onExpandedChange = onExpandChange,
             ) {
                 TextField(
                     modifier = Modifier
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetTest.kt
index af0436a..2c6213d 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/ModalBottomSheetTest.kt
@@ -1325,7 +1325,7 @@
         // TODO: 33 > API > 29 does not use imePadding because of b/285746907, include when a better solution is found.
         Assume.assumeTrue(SDK_INT >= 33)
 
-        val imeAnimationDuration = 750000L
+        val imeAnimationDuration = 1000000L
         val textFieldTag = "sheetTextField"
 
         lateinit var sheetState: SheetState
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonTest.kt
index 8f1a178..7c2c540 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SegmentedButtonTest.kt
@@ -19,6 +19,7 @@
 import androidx.compose.foundation.BorderStroke
 import androidx.compose.foundation.layout.width
 import androidx.compose.material3.tokens.OutlinedSegmentedButtonTokens
+import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
@@ -26,6 +27,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.semantics.getOrNull
@@ -37,6 +39,7 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -196,7 +199,34 @@
             }
         }
             .assertWidthIsAtLeast((itemSize + 12.dp * 2) * 2)
-            .assertHeightIsEqualTo(OutlinedSegmentedButtonTokens.ContainerHeight)
+            .assertHeightIsEqualTo(48.dp)
+    }
+
+    @Test
+    fun segmentedButton_fontScale_correctSizing() {
+        val itemSize = 60.dp
+
+        rule.setMaterialContentForSizeAssertions(
+            parentMaxWidth = 300.dp, parentMaxHeight = 100.dp
+        ) {
+            CompositionLocalProvider(
+                LocalDensity provides Density(
+                    density = LocalDensity.current.density,
+                    fontScale = 2f
+                )
+            ) {
+                MultiChoiceSegmentedButtonRow {
+                    SegmentedButton(checked = false, onCheckedChange = {}, shape = RectangleShape) {
+                        Text(modifier = Modifier.width(60.dp), text = "Day")
+                    }
+                    SegmentedButton(checked = false, onCheckedChange = {}, shape = RectangleShape) {
+                        Text(modifier = Modifier.width(30.dp), text = "Month")
+                    }
+                }
+            }
+        }
+            .assertWidthIsAtLeast((itemSize + 12.dp * 2) * 2)
+            .assertHeightIsEqualTo(53.dp)
     }
 
     @Test
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextTest.kt
index f19952b..7000381 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/TextTest.kt
@@ -24,8 +24,12 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performSemanticsAction
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextLayoutResult
@@ -326,4 +330,24 @@
             .performSemanticsAction(SemanticsActions.GetTextLayoutResult) { it(textLayoutResults) }
         return textLayoutResults.firstOrNull()
     }
+
+    @Test
+    fun semantics_hasColor_providedByParameter() {
+        val expectedColor = Color(0.7f, 0.13f, 1.0f, 0.323f)
+        rule.setContent {
+            Text(
+                "Test",
+                color = expectedColor
+            )
+        }
+
+        rule.onNodeWithText("Test").assert(SemanticsMatcher("") {
+            val textLayoutResult = ArrayList<TextLayoutResult>()
+            it.config.getOrNull(SemanticsActions.GetTextLayoutResult)?.action?.invoke(
+                textLayoutResult
+            )
+            val color = textLayoutResult.first().layoutInput.style.color
+            color == expectedColor
+        })
+    }
 }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.kt
index b3b34c4..a1f9f3e 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/ExposedDropdownMenu.kt
@@ -1039,7 +1039,7 @@
     menuDescription: String,
     expandedDescription: String,
     collapsedDescription: String,
-) = pointerInput(Unit) {
+) = pointerInput(onExpandedChange) {
     awaitEachGesture {
         // Must be PointerEventPass.Initial to observe events before the text field consumes them
         // in the Main pass
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
index 30c9d03..8ee016c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
@@ -126,7 +126,6 @@
  * [Interaction]s and customize the appearance / behavior of this card in different states.
  *
  */
-@ExperimentalMaterial3Api
 @Composable
 fun Card(
     onClick: () -> Unit,
@@ -225,7 +224,6 @@
  * for this card. You can create and pass in your own `remember`ed instance to observe
  * [Interaction]s and customize the appearance / behavior of this card in different states.
  */
-@ExperimentalMaterial3Api
 @Composable
 fun ElevatedCard(
     onClick: () -> Unit,
@@ -321,7 +319,6 @@
  * for this card. You can create and pass in your own `remember`ed instance to observe
  * [Interaction]s and customize the appearance / behavior of this card in different states.
  */
-@ExperimentalMaterial3Api
 @Composable
 fun OutlinedCard(
     onClick: () -> Unit,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
index 53851db..c4be616 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Chip.kt
@@ -254,7 +254,6 @@
  * for this chip. You can create and pass in your own `remember`ed instance to observe
  * [Interaction]s and customize the appearance / behavior of this chip in different states.
  */
-@ExperimentalMaterial3Api
 @Composable
 fun FilterChip(
     selected: Boolean,
@@ -334,7 +333,6 @@
  * for this chip. You can create and pass in your own `remember`ed instance to observe
  * [Interaction]s and customize the appearance / behavior of this chip in different states.
  */
-@ExperimentalMaterial3Api
 @Composable
 fun ElevatedFilterChip(
     selected: Boolean,
@@ -418,7 +416,6 @@
  * for this chip. You can create and pass in your own `remember`ed instance to observe
  * [Interaction]s and customize the appearance / behavior of this chip in different states.
  */
-@ExperimentalMaterial3Api
 @Composable
 fun InputChip(
     selected: Boolean,
@@ -789,7 +786,6 @@
 /**
  * Contains the baseline values used by [FilterChip].
  */
-@ExperimentalMaterial3Api
 object FilterChipDefaults {
     /**
      * The height applied for a filter chip.
@@ -1001,7 +997,6 @@
 /**
  * Contains the baseline values used by an [InputChip].
  */
-@ExperimentalMaterial3Api
 object InputChipDefaults {
     /**
      * The height applied for an input chip.
@@ -1345,7 +1340,6 @@
     }
 }
 
-@ExperimentalMaterial3Api
 @Composable
 private fun SelectableChip(
     selected: Boolean,
@@ -1609,7 +1603,6 @@
  * @param draggedElevation the elevation used when the chip is dragged
  * @param disabledElevation the elevation used when the chip is not enabled
  */
-@ExperimentalMaterial3Api
 @Immutable
 class SelectableChipElevation internal constructor(
     val elevation: Dp,
@@ -1858,7 +1851,6 @@
  * See [FilterChipDefaults.filterChipColors] and [FilterChipDefaults.elevatedFilterChipColors] for
  * the default colors used in [FilterChip].
  */
-@ExperimentalMaterial3Api
 @Immutable
 class SelectableChipColors constructor(
     private val containerColor: Color,
@@ -1977,7 +1969,6 @@
 /**
  * Represents the border stroke used used in a selectable chip in different states.
  */
-@ExperimentalMaterial3Api
 @Immutable
 class SelectableChipBorder internal constructor(
     private val borderColor: Color,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
index 9f2c7b0..e3cef8e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
@@ -83,7 +83,6 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
-import androidx.compose.ui.util.fastFold
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.fastMap
 import androidx.compose.ui.util.fastMaxBy
@@ -222,7 +221,8 @@
             .defaultMinSize(
                 minWidth = ButtonDefaults.MinWidth,
                 minHeight = ButtonDefaults.MinHeight
-            ).semantics { role = Role.RadioButton },
+            )
+            .semantics { role = Role.RadioButton },
         selected = selected,
         onClick = onClick,
         enabled = enabled,
@@ -262,7 +262,7 @@
     Row(
         modifier = modifier
             .selectableGroup()
-            .height(OutlinedSegmentedButtonTokens.ContainerHeight)
+            .defaultMinSize(minHeight = OutlinedSegmentedButtonTokens.ContainerHeight)
             .width(IntrinsicSize.Min),
         horizontalArrangement = Arrangement.spacedBy(-space),
         verticalAlignment = Alignment.CenterVertically
@@ -299,7 +299,7 @@
 ) {
     Row(
         modifier = modifier
-            .height(OutlinedSegmentedButtonTokens.ContainerHeight)
+            .defaultMinSize(minHeight = OutlinedSegmentedButtonTokens.ContainerHeight)
             .width(IntrinsicSize.Min),
         horizontalArrangement = Arrangement.spacedBy(-space),
         verticalAlignment = Alignment.CenterVertically
@@ -315,7 +315,10 @@
     icon: @Composable () -> Unit,
     content: @Composable () -> Unit,
 ) {
-    Box(contentAlignment = Alignment.Center) {
+    Box(
+        contentAlignment = Alignment.Center,
+        modifier = Modifier.padding(ButtonDefaults.TextButtonContentPadding)
+    ) {
         val typography =
             MaterialTheme.typography.fromToken(OutlinedSegmentedButtonTokens.LabelTextFont)
         ProvideTextStyle(typography) {
@@ -323,7 +326,7 @@
             val measurePolicy = remember { SegmentedButtonContentMeasurePolicy(scope) }
 
             Layout(
-                modifier = Modifier.padding(ButtonDefaults.TextButtonContentPadding),
+                modifier = Modifier.height(IntrinsicSize.Min),
                 contents = listOf(icon, content),
                 measurePolicy = measurePolicy
             )
@@ -344,20 +347,17 @@
     ): MeasureResult {
         val (iconMeasurables, contentMeasurables) = measurables
         val iconPlaceables = iconMeasurables.fastMap { it.measure(constraints) }
-        val iconDesiredWidth = iconMeasurables.fastFold(0) { acc, it ->
-            maxOf(acc, it.maxIntrinsicWidth(Constraints.Infinity))
-        }
         val iconWidth = iconPlaceables.fastMaxBy { it.width }?.width ?: 0
         val contentPlaceables = contentMeasurables.fastMap { it.measure(constraints) }
         val contentWidth = contentPlaceables.fastMaxBy { it.width }?.width
-        val width = maxOf(SegmentedButtonDefaults.IconSize.roundToPx(), iconDesiredWidth) +
+        val height = contentPlaceables.fastMaxBy { it.height }?.height ?: 0
+        val width = maxOf(SegmentedButtonDefaults.IconSize.roundToPx(), iconWidth) +
             IconSpacing.roundToPx() +
             (contentWidth ?: 0)
-
         val offsetX = if (iconWidth == 0) {
             -(SegmentedButtonDefaults.IconSize.roundToPx() + IconSpacing.roundToPx()) / 2
         } else {
-            iconDesiredWidth - SegmentedButtonDefaults.IconSize.roundToPx()
+            0
         }
 
         if (initialOffset == null) {
@@ -372,9 +372,9 @@
             }
         }
 
-        return layout(width, constraints.maxHeight) {
+        return layout(width, height) {
             iconPlaceables.fastForEach {
-                it.place(0, (constraints.maxHeight - it.height) / 2)
+                it.place(0, (height - it.height) / 2)
             }
 
             val contentOffsetX = SegmentedButtonDefaults.IconSize.roundToPx() +
@@ -383,7 +383,7 @@
             contentPlaceables.fastForEach {
                 it.place(
                     contentOffsetX,
-                    (constraints.maxHeight - it.height) / 2
+                    (height - it.height) / 2
                 )
             }
         }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
index 4ec7a34..be6dc53 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tooltip.kt
@@ -98,6 +98,8 @@
  * @param tooltipState handles the state of the tooltip's visibility.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param containerColor [Color] that will be applied to the tooltip's container.
+ * @param tonalElevation the tonal elevation of the tooltip.
+ * @param shadowElevation the shadow elevation of the tooltip.
  * @param contentColor [Color] that will be applied to the tooltip's content.
  * @param content the composable that the tooltip will anchor to.
  */
@@ -112,6 +114,8 @@
     tooltipState: PlainTooltipState = rememberPlainTooltipState(),
     shape: Shape = TooltipDefaults.plainTooltipContainerShape,
     containerColor: Color = TooltipDefaults.plainTooltipContainerColor,
+    tonalElevation: Dp = 0.dp,
+    shadowElevation: Dp = 0.dp,
     contentColor: Color = TooltipDefaults.plainTooltipContentColor,
     content: @Composable TooltipBoxScope.() -> Unit
 ) {
@@ -133,7 +137,8 @@
         shape = shape,
         containerColor = containerColor,
         tooltipPositionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
-        elevation = 0.dp,
+        tonalElevation = tonalElevation,
+        shadowElevation = shadowElevation,
         maxWidth = PlainTooltipMaxWidth,
         content = content
     )
@@ -163,6 +168,8 @@
  * @param action An optional action for the tooltip.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param colors [RichTooltipColors] that will be applied to the tooltip's container and content.
+ * @param tonalElevation the tonal elevation of the tooltip.
+ * @param shadowElevation the shadow elevation of the tooltip.
  * @param content the composable that the tooltip will anchor to.
  */
 @Suppress("DEPRECATION")
@@ -178,6 +185,8 @@
     tooltipState: RichTooltipState = rememberRichTooltipState(action != null),
     shape: Shape = TooltipDefaults.richTooltipContainerShape,
     colors: RichTooltipColors = TooltipDefaults.richTooltipColors(),
+    tonalElevation: Dp = RichTooltipTokens.ContainerElevation,
+    shadowElevation: Dp = RichTooltipTokens.ContainerElevation,
     content: @Composable TooltipBoxScope.() -> Unit
 ) {
     Material3TooltipBox(
@@ -230,7 +239,8 @@
         containerColor = colors.containerColor,
         tooltipPositionProvider = TooltipDefaults.rememberRichTooltipPositionProvider(),
         tooltipState = tooltipState,
-        elevation = RichTooltipTokens.ContainerElevation,
+        tonalElevation = tonalElevation,
+        shadowElevation = shadowElevation,
         maxWidth = RichTooltipMaxWidth,
         modifier = modifier,
         focusable = focusable,
@@ -249,7 +259,8 @@
     shape: Shape,
     tooltipState: BasicTooltipState,
     containerColor: Color,
-    elevation: Dp,
+    tonalElevation: Dp,
+    shadowElevation: Dp,
     maxWidth: Dp,
     content: @Composable TooltipBoxScope.() -> Unit,
 ) {
@@ -326,8 +337,8 @@
                         },
                     shape = shape,
                     color = containerColor,
-                    shadowElevation = elevation,
-                    tonalElevation = elevation,
+                    tonalElevation = tonalElevation,
+                    shadowElevation = shadowElevation,
                     content = tooltipContent
                 )
             }
@@ -603,6 +614,7 @@
  * @param content the composable that the tooltip will anchor to.
  */
 @Composable
+@ExperimentalMaterial3Api
 fun TooltipBox(
     positionProvider: PopupPositionProvider,
     tooltip: @Composable () -> Unit,
@@ -632,21 +644,27 @@
  * @param modifier the [Modifier] to be applied to the tooltip.
  * @param contentColor [Color] that will be applied to the tooltip's content.
  * @param containerColor [Color] that will be applied to the tooltip's container.
+ * @param tonalElevation the tonal elevation of the tooltip.
+ * @param shadowElevation the shadow elevation of the tooltip.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param content the composable that will be used to populate the tooltip's content.
  */
-@OptIn(ExperimentalMaterial3Api::class)
 @Composable
+@ExperimentalMaterial3Api
 fun PlainTooltip(
     modifier: Modifier = Modifier,
     contentColor: Color = TooltipDefaults.plainTooltipContentColor,
     containerColor: Color = TooltipDefaults.plainTooltipContainerColor,
+    tonalElevation: Dp = 0.dp,
+    shadowElevation: Dp = 0.dp,
     shape: Shape = TooltipDefaults.plainTooltipContainerShape,
     content: @Composable () -> Unit
 ) {
     Surface(
         shape = shape,
-        color = containerColor
+        color = containerColor,
+        tonalElevation = tonalElevation,
+        shadowElevation = shadowElevation
     ) {
         Box(modifier = modifier
             .sizeIn(
@@ -677,16 +695,20 @@
  * @param title An optional title for the tooltip.
  * @param action An optional action for the tooltip.
  * @param colors [RichTooltipColors] that will be applied to the tooltip's container and content.
+ * @param tonalElevation the tonal elevation of the tooltip.
+ * @param shadowElevation the shadow elevation of the tooltip.
  * @param shape the [Shape] that should be applied to the tooltip container.
  * @param text the composable that will be used to populate the rich tooltip's text.
  */
-@OptIn(ExperimentalMaterial3Api::class)
 @Composable
+@ExperimentalMaterial3Api
 fun RichTooltip(
     modifier: Modifier = Modifier,
     title: (@Composable () -> Unit)? = null,
     action: (@Composable () -> Unit)? = null,
     colors: RichTooltipColors = TooltipDefaults.richTooltipColors(),
+    tonalElevation: Dp = RichTooltipTokens.ContainerElevation,
+    shadowElevation: Dp = RichTooltipTokens.ContainerElevation,
     shape: Shape = TooltipDefaults.richTooltipContainerShape,
     text: @Composable () -> Unit
 ) {
@@ -699,8 +721,8 @@
             ),
         shape = shape,
         color = colors.containerColor,
-        shadowElevation = RichTooltipTokens.ContainerElevation,
-        tonalElevation = RichTooltipTokens.ContainerElevation
+        tonalElevation = tonalElevation,
+        shadowElevation = shadowElevation
     ) {
         val actionLabelTextStyle =
             MaterialTheme.typography.fromToken(RichTooltipTokens.ActionLabelTextFont)
@@ -951,6 +973,7 @@
  * @param mutatorMutex [MutatorMutex] used to ensure that for all of the tooltips associated
  * with the mutator mutex, only one will be shown on the screen at any time.
  */
+@ExperimentalMaterial3Api
 fun TooltipState(
     initialIsVisible: Boolean = false,
     isPersistent: Boolean = true,
@@ -962,6 +985,7 @@
         mutatorMutex = mutatorMutex
     )
 
+@OptIn(ExperimentalMaterial3Api::class)
 @Stable
 private class TooltipStateImpl(
     initialIsVisible: Boolean,
@@ -1036,6 +1060,7 @@
  * The state that is associated with a [TooltipBox].
  * Each instance of [TooltipBox] should have its own [TooltipState].
  */
+@ExperimentalMaterial3Api
 interface TooltipState : BasicTooltipState {
     /**
      * The current transition state of the tooltip.
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index 709c9f2..2f32224 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -334,6 +334,9 @@
     property @androidx.compose.runtime.snapshots.AutoboxingStateValueProperty(preferredPropertyName="floatValue") public default Float value;
   }
 
+  public final class HotReloaderKt {
+  }
+
   @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Immutable {
   }
 
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index a0db42c..dccb6e4 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -366,6 +366,9 @@
     property @androidx.compose.runtime.snapshots.AutoboxingStateValueProperty(preferredPropertyName="floatValue") public default Float value;
   }
 
+  public final class HotReloaderKt {
+  }
+
   @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Immutable {
   }
 
diff --git a/compose/runtime/runtime/lint-baseline.xml b/compose/runtime/runtime/lint-baseline.xml
index 7076dfa2..9050a71 100644
--- a/compose/runtime/runtime/lint-baseline.xml
+++ b/compose/runtime/runtime/lint-baseline.xml
@@ -7,7 +7,7 @@
         errorLine1="fun simulateHotReload(context: Any) = HotReloader.simulateHotReload(context)"
         errorLine2="    ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/commonMain/kotlin/androidx/compose/runtime/Composition.kt"/>
+            file="src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt"/>
     </issue>
 
     <issue
@@ -16,7 +16,7 @@
         errorLine1="fun invalidateGroupsWithKey(key: Int) = HotReloader.invalidateGroupsWithKey(key)"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/commonMain/kotlin/androidx/compose/runtime/Composition.kt"/>
+            file="src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt"/>
     </issue>
 
     <issue
@@ -25,7 +25,7 @@
         errorLine1="fun currentCompositionErrors(): List&lt;Pair&lt;Exception, Boolean>> ="
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/commonMain/kotlin/androidx/compose/runtime/Composition.kt"/>
+            file="src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt"/>
     </issue>
 
     <issue
@@ -34,7 +34,7 @@
         errorLine1="fun clearCompositionErrors() = HotReloader.clearErrors()"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/commonMain/kotlin/androidx/compose/runtime/Composition.kt"/>
+            file="src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt"/>
     </issue>
 
     <issue
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.android.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.android.kt
index 13d9104..f9fde8e 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.android.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.android.kt
@@ -114,4 +114,12 @@
     Log.e(LogTag, message, e)
 }
 
-internal actual val MainThreadId: Long = Looper.getMainLooper()?.thread?.id ?: -1
+internal actual val MainThreadId: Long =
+    try {
+        Looper.getMainLooper().thread.id
+    } catch (e: Exception) {
+        // When linked against Android SDK stubs and running host-side tests, APIs such as
+        // Looper.getMainLooper() can throw or return null
+        // This branch intercepts that exception and returns default value for such cases.
+        -1
+    }
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 1c019dc4..775fce2 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
@@ -19,6 +19,7 @@
 )
 package androidx.compose.runtime
 
+import androidx.collection.MutableIntIntMap
 import androidx.compose.runtime.Composer.Companion.equals
 import androidx.compose.runtime.changelist.ChangeList
 import androidx.compose.runtime.changelist.ComposerChangeListWriter
@@ -1263,7 +1264,7 @@
     private var groupNodeCount: Int = 0
     private var groupNodeCountStack = IntStack()
     private var nodeCountOverrides: IntArray? = null
-    private var nodeCountVirtualOverrides: HashMap<Int, Int>? = null
+    private var nodeCountVirtualOverrides: MutableIntIntMap? = null
     private var forceRecomposeScopes = false
     private var forciblyRecompose = false
     private var nodeExpected = false
@@ -1271,7 +1272,7 @@
     private val entersStack = IntStack()
     private var parentProvider: PersistentCompositionLocalMap =
         persistentCompositionLocalHashMapOf()
-    private val providerUpdates = IntMap<PersistentCompositionLocalMap>()
+    private var providerUpdates: IntMap<PersistentCompositionLocalMap>? = null
     private var providersInvalid = false
     private val providersInvalidStack = IntStack()
     private var reusing = false
@@ -1497,7 +1498,7 @@
         groupNodeCountStack.clear()
         entersStack.clear()
         providersInvalidStack.clear()
-        providerUpdates.clear()
+        providerUpdates = null
         if (!reader.closed) {
             reader.close()
         }
@@ -1517,7 +1518,7 @@
     }
 
     internal fun changesApplied() {
-        providerUpdates.clear()
+        providerUpdates = null
     }
 
     /**
@@ -1573,7 +1574,7 @@
         invalidateStack.clear()
         invalidations.clear()
         changes.clear()
-        providerUpdates.clear()
+        providerUpdates = null
     }
 
     internal fun forceRecomposeScopes(): Boolean {
@@ -1995,7 +1996,7 @@
                     reader.groupObjectKey(current) == compositionLocalMap
                 ) {
                     @Suppress("UNCHECKED_CAST")
-                    val providers = providerUpdates[current]
+                    val providers = providerUpdates?.get(current)
                         ?: reader.groupAux(current) as PersistentCompositionLocalMap
                     providerCache = providers
                     return providers
@@ -2054,7 +2055,7 @@
             invalid = reusing || oldScope !== providers
         }
         if (invalid && !inserting) {
-            providerUpdates[reader.currentGroup] = providers
+            recordProviderUpdate(providers)
         }
         providersInvalidStack.push(providersInvalid.asInt())
         providersInvalid = invalid
@@ -2062,6 +2063,15 @@
         start(compositionLocalMapKey, compositionLocalMap, GroupKind.Group, providers)
     }
 
+    private fun recordProviderUpdate(providers: PersistentCompositionLocalMap) {
+        val providerUpdates = providerUpdates ?: run {
+            val newProviderUpdates = IntMap<PersistentCompositionLocalMap>()
+            this.providerUpdates = newProviderUpdates
+            newProviderUpdates
+        }
+        providerUpdates[reader.currentGroup] = providers
+    }
+
     @InternalComposeApi
     override fun endProvider() {
         endGroup()
@@ -2105,7 +2115,7 @@
         }
 
         if (invalid && !inserting) {
-            providerUpdates[reader.currentGroup] = providers
+            recordProviderUpdate(providers)
         }
         providersInvalidStack.push(providersInvalid.asInt())
         providersInvalid = invalid
@@ -2674,7 +2684,9 @@
     }
 
     private fun updatedNodeCount(group: Int): Int {
-        if (group < 0) return nodeCountVirtualOverrides?.let { it[group] } ?: 0
+        if (group < 0) return nodeCountVirtualOverrides?.let {
+            if (it.contains(group)) it[group] else 0
+        } ?: 0
         val nodeCounts = nodeCountOverrides
         if (nodeCounts != null) {
             val override = nodeCounts[group]
@@ -2687,7 +2699,7 @@
         if (updatedNodeCount(group) != count) {
             if (group < 0) {
                 val virtualCounts = nodeCountVirtualOverrides ?: run {
-                    val newCounts = HashMap<Int, Int>()
+                    val newCounts = MutableIntIntMap()
                     nodeCountVirtualOverrides = newCounts
                     newCounts
                 }
@@ -2963,15 +2975,15 @@
             // changes to the locals as the value moves well as enables finding the correct providers
             // when applying late changes which might be very complicated otherwise.
             val providersChanged = if (inserting) false else reader.groupAux != locals
-            if (providersChanged) providerUpdates[reader.currentGroup] = locals
+            if (providersChanged) recordProviderUpdate(locals)
             start(compositionLocalMapKey, compositionLocalMap, GroupKind.Group, locals)
+            providerCache = null
 
             // Either insert a place-holder to be inserted later (either created new or moved from
             // another location) or (re)compose the movable content. This is forced if a new value
             // needs to be created as a late change.
             if (inserting && !force) {
                 writerHasAProvider = true
-                providerCache = null
 
                 // Create an anchor to the movable group
                 val anchor = writer.anchor(writer.parent(writer.parent))
@@ -2994,6 +3006,7 @@
         } finally {
             // Restore the state back to what is expected by the caller.
             endGroup()
+            providerCache = null
             compoundKeyHash = savedCompoundKeyHash
             endMovableGroup()
         }
@@ -3141,13 +3154,16 @@
     private inline fun <R> withReader(reader: SlotReader, block: () -> R): R {
         val savedReader = this.reader
         val savedCountOverrides = nodeCountOverrides
+        val savedProviderUpdates = providerUpdates
         nodeCountOverrides = null
+        providerUpdates = null
         try {
             this.reader = reader
             return block()
         } finally {
             this.reader = savedReader
             nodeCountOverrides = savedCountOverrides
+            providerUpdates = savedProviderUpdates
         }
     }
 
@@ -3257,7 +3273,7 @@
         runtimeCheck(!isComposing) { "Reentrant composition is not supported" }
         trace("Compose:recompose") {
             compositionToken = currentSnapshot().id
-            providerUpdates.clear()
+            providerUpdates = null
             invalidationsRequested.forEach { scope, set ->
                 val location = scope.anchor?.location ?: return
                 invalidations.add(Invalidation(scope, location, set))
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
index 4ea0406..dda51f8 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
@@ -1341,77 +1341,6 @@
     }
 }
 
-/**
- * Apply Code Changes will invoke the two functions before and after a code swap.
- *
- * This forces the whole view hierarchy to be redrawn to invoke any code change that was
- * introduce in the code swap.
- *
- * All these are private as within JVMTI / JNI accessibility is mostly a formality.
- */
-private class HotReloader {
-    companion object {
-        // Called before Dex Code Swap
-        @Suppress("UNUSED_PARAMETER")
-        private fun saveStateAndDispose(context: Any): Any {
-            return Recomposer.saveStateAndDisposeForHotReload()
-        }
-
-        // Called after Dex Code Swap
-        private fun loadStateAndCompose(token: Any) {
-            Recomposer.loadStateAndComposeForHotReload(token)
-        }
-
-        @TestOnly
-        internal fun simulateHotReload(context: Any) {
-            loadStateAndCompose(saveStateAndDispose(context))
-        }
-
-        @TestOnly
-        internal fun invalidateGroupsWithKey(key: Int) {
-            return Recomposer.invalidateGroupsWithKey(key)
-        }
-
-        @TestOnly
-        internal fun getCurrentErrors(): List<RecomposerErrorInfo> {
-            return Recomposer.getCurrentErrors()
-        }
-
-        @TestOnly
-        internal fun clearErrors() {
-            return Recomposer.clearErrors()
-        }
-    }
-}
-
-/**
- * @suppress
- */
-@TestOnly
-fun simulateHotReload(context: Any) = HotReloader.simulateHotReload(context)
-
-/**
- * @suppress
- */
-@TestOnly
-fun invalidateGroupsWithKey(key: Int) = HotReloader.invalidateGroupsWithKey(key)
-
-/**
- * @suppress
- */
-// suppressing for test-only api
-@Suppress("ListIterator")
-@TestOnly
-fun currentCompositionErrors(): List<Pair<Exception, Boolean>> =
-    HotReloader.getCurrentErrors()
-        .map { it.cause to it.recoverable }
-
-/**
- * @suppress
- */
-@TestOnly
-fun clearCompositionErrors() = HotReloader.clearErrors()
-
 private fun <K : Any, V : Any> IdentityArrayMap<K, IdentityArraySet<V>?>.addValue(
     key: K,
     value: V
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt
new file mode 100644
index 0000000..c9683a8
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/HotReloader.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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:OptIn(InternalComposeApi::class)
+package androidx.compose.runtime
+
+/**
+ * Apply Code Changes will invoke the two functions before and after a code swap.
+ *
+ * This forces the whole view hierarchy to be redrawn to invoke any code change that was
+ * introduce in the code swap.
+ *
+ * All these are private as within JVMTI / JNI accessibility is mostly a formality.
+ */
+private class HotReloader {
+    companion object {
+        // Called before Dex Code Swap
+        @Suppress("UNUSED_PARAMETER")
+        private fun saveStateAndDispose(context: Any): Any {
+            return Recomposer.saveStateAndDisposeForHotReload()
+        }
+
+        // Called after Dex Code Swap
+        private fun loadStateAndCompose(token: Any) {
+            Recomposer.loadStateAndComposeForHotReload(token)
+        }
+
+        @TestOnly
+        internal fun simulateHotReload(context: Any) {
+            loadStateAndCompose(saveStateAndDispose(context))
+        }
+
+        @TestOnly
+        internal fun invalidateGroupsWithKey(key: Int) {
+            return Recomposer.invalidateGroupsWithKey(key)
+        }
+
+        @TestOnly
+        internal fun getCurrentErrors(): List<RecomposerErrorInfo> {
+            return Recomposer.getCurrentErrors()
+        }
+
+        @TestOnly
+        internal fun clearErrors() {
+            return Recomposer.clearErrors()
+        }
+    }
+}
+
+/**
+ * @suppress
+ */
+@TestOnly
+fun simulateHotReload(context: Any) = HotReloader.simulateHotReload(context)
+
+/**
+ * @suppress
+ */
+@TestOnly
+fun invalidateGroupsWithKey(key: Int) = HotReloader.invalidateGroupsWithKey(key)
+
+/**
+ * @suppress
+ */
+// suppressing for test-only api
+@Suppress("ListIterator")
+@TestOnly
+fun currentCompositionErrors(): List<Pair<Exception, Boolean>> =
+    HotReloader.getCurrentErrors()
+        .map { it.cause to it.recoverable }
+
+/**
+ * @suppress
+ */
+@TestOnly
+fun clearCompositionErrors() = HotReloader.clearErrors()
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 07d44bf..c34bf70 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
@@ -16,8 +16,8 @@
 
 package androidx.compose.runtime
 
-import androidx.compose.runtime.collection.IdentityArrayIntMap
-import androidx.compose.runtime.collection.IdentityArrayMap
+import androidx.collection.MutableObjectIntMap
+import androidx.collection.MutableScatterMap
 import androidx.compose.runtime.collection.IdentityArraySet
 import androidx.compose.runtime.snapshots.fastAny
 import androidx.compose.runtime.snapshots.fastForEach
@@ -253,8 +253,8 @@
     override fun updateScope(block: (Composer, Int) -> Unit) { this.block = block }
 
     private var currentToken = 0
-    private var trackedInstances: IdentityArrayIntMap? = null
-    private var trackedDependencies: IdentityArrayMap<DerivedState<*>, Any?>? = null
+    private var trackedInstances: MutableObjectIntMap<Any>? = null
+    private var trackedDependencies: MutableScatterMap<DerivedState<*>, Any?>? = null
     private var rereading: Boolean
         get() = flags and RereadingFlag != 0
         set(value) {
@@ -299,15 +299,15 @@
     fun recordRead(instance: Any): Boolean {
         if (rereading) return false // Re-reading should force composition to update its tracking
 
-        val token = (trackedInstances ?: IdentityArrayIntMap().also { trackedInstances = it })
-            .add(instance, currentToken)
+        val token = (trackedInstances ?: MutableObjectIntMap<Any>().also { trackedInstances = it })
+            .put(instance, currentToken, default = -1)
 
         if (token == currentToken) {
             return true
         }
 
         if (instance is DerivedState<*>) {
-            val tracked = trackedDependencies ?: IdentityArrayMap<DerivedState<*>, Any?>().also {
+            val tracked = trackedDependencies ?: MutableScatterMap<DerivedState<*>, Any?>().also {
                 trackedDependencies = it
             }
             tracked[instance] = instance.currentRecord.currentValue
@@ -382,7 +382,7 @@
                     currentToken == token && instances == trackedInstances &&
                     composition is CompositionImpl
                 ) {
-                    instances.removeValueIf { instance, instanceToken ->
+                    instances.removeIf { instance, instanceToken ->
                         (instanceToken != token).also { remove ->
                             if (remove) {
                                 composition.removeObservation(instance, this)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
index 3accee3..fad7d68 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
@@ -47,7 +47,8 @@
 /* ktlint-disable parameter-list-wrapping */ // TODO(https://github.com/pinterest/ktlint/issues/921): reenable
 internal expect class ComposableLambdaImpl(
     key: Int,
-    tracked: Boolean
+    tracked: Boolean,
+    block: Any?,
 ) : ComposableLambda {
     fun update(block: Any)
 }
@@ -331,13 +332,14 @@
     composer.startReplaceableGroup(key)
     val slot = composer.rememberedValue()
     val result = if (slot === Composer.Empty) {
-        val value = ComposableLambdaImpl(key, tracked)
+        val value = ComposableLambdaImpl(key, tracked, block)
         composer.updateRememberedValue(value)
         value
     } else {
         slot as ComposableLambdaImpl
+        slot.update(block)
+        slot
     }
-    result.update(block)
     composer.endReplaceableGroup()
     return result
 }
@@ -349,4 +351,4 @@
     tracked: Boolean,
     block: Any
 ): ComposableLambda =
-    ComposableLambdaImpl(key, tracked).apply { update(block) }
+    ComposableLambdaImpl(key, tracked, block)
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
index d1772a9..0a8c517 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
@@ -37,9 +37,10 @@
 /* ktlint-disable parameter-list-wrapping */ // TODO(https://github.com/pinterest/ktlint/issues/921): reenable
 internal actual class ComposableLambdaImpl actual constructor(
     val key: Int,
-    private val tracked: Boolean
+    private val tracked: Boolean,
+    block: Any?
 ) : ComposableLambda {
-    private var _block: Any? = null
+    private var _block: Any? = block
     private var scope: RecomposeScope? = null
     private var scopes: MutableList<RecomposeScope>? = null
 
diff --git a/compose/test-utils/build.gradle b/compose/test-utils/build.gradle
index 8e330f4..230c55d 100644
--- a/compose/test-utils/build.gradle
+++ b/compose/test-utils/build.gradle
@@ -23,11 +23,9 @@
     id("AndroidXComposePlugin")
 }
 
-def desktopEnabled = false // b/276387374 TODO: KmpPlatformsKt.enableDesktop(project)
-
 androidXMultiplatform {
     android()
-    if (desktopEnabled) desktop()
+    desktop()
 
     sourceSets {
         commonMain {
@@ -71,11 +69,9 @@
             }
         }
 
-        if (desktopEnabled) {
-            desktopMain {
-                dependsOn(jvmMain)
-                dependencies {
-                }
+        desktopMain {
+            dependsOn(jvmMain)
+            dependencies {
             }
         }
 
@@ -100,11 +96,9 @@
             }
         }
 
-        if (desktopEnabled) {
-            desktopTest {
-                dependsOn(jvmTest)
-                dependencies {
-                }
+        desktopTest {
+            dependsOn(jvmTest)
+            dependencies {
             }
         }
     }
diff --git a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/NativeView.android.kt b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/NativeView.android.kt
new file mode 100644
index 0000000..017dbe0
--- /dev/null
+++ b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/NativeView.android.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.testutils
+
+actual typealias NativeView = android.view.View
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
index 3d67155..0a9521c 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.testutils
 
-import android.view.View
+expect class NativeView
 
 /**
  * Test scope accessible from execution controlled tests to test compose.
@@ -92,7 +92,12 @@
      */
     fun recompose()
 
-    fun getHostView(): View
+    /**
+     * Please avoid using this API; Make your tests more platform agnostic by utilizing platform-
+     * independent test hooks instead of invoking APIs on native views.
+     * This API may be removed in the future.
+     */
+    fun getHostView(): NativeView
 }
 
 /**
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
index 933f5aaf..0682039 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
@@ -16,12 +16,11 @@
 
 package androidx.compose.testutils
 
-import android.annotation.SuppressLint
 import androidx.compose.ui.Modifier
 
 fun Modifier.toList(): List<Modifier.Element> =
     foldIn(mutableListOf()) { acc, e -> acc.apply { acc.add(e) } }
 
-@SuppressLint("ModifierFactoryReturnType")
+@Suppress("ModifierFactoryReturnType")
 fun Modifier.first(): Modifier.Element =
     toList().first()
diff --git a/compose/test-utils/src/desktopMain/kotlin/androidx/compose/testutils/NativeView.desktop.kt b/compose/test-utils/src/desktopMain/kotlin/androidx/compose/testutils/NativeView.desktop.kt
new file mode 100644
index 0000000..6eac797
--- /dev/null
+++ b/compose/test-utils/src/desktopMain/kotlin/androidx/compose/testutils/NativeView.desktop.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.testutils
+
+class NativeViewEmptyImpl
+actual typealias NativeView = NativeViewEmptyImpl
diff --git a/compose/ui/ui-android-stubs/api/api_lint.ignore b/compose/ui/ui-android-stubs/api/api_lint.ignore
index 6a77ca1..0e88b37 100644
--- a/compose/ui/ui-android-stubs/api/api_lint.ignore
+++ b/compose/ui/ui-android-stubs/api/api_lint.ignore
@@ -1,3 +1,7 @@
 // Baseline format: 1.0
 GetterSetterNames: android.view.RenderNode#getClipToOutline():
     Symmetric method for `setClipToOutline` must be named `isClipToOutline`; was `getClipToOutline`
+
+
+NotCloseable: android.view.RenderNode:
+    Classes that release resources (destroy()) should implement AutoCloseable and CloseGuard: class android.view.RenderNode
diff --git a/compose/ui/ui-test-junit4/api/api_lint.ignore b/compose/ui/ui-test-junit4/api/api_lint.ignore
index 4857f646..0a2af4f 100644
--- a/compose/ui/ui-test-junit4/api/api_lint.ignore
+++ b/compose/ui/ui-test-junit4/api/api_lint.ignore
@@ -3,7 +3,3 @@
     Invalid nullability on parameter `base` in method `apply`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.compose.ui.test.junit4.AndroidComposeTestRule#apply(org.junit.runners.model.Statement, org.junit.runner.Description) parameter #1:
     Invalid nullability on parameter `description` in method `apply`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-
-
-MissingNullability: androidx.compose.ui.test.junit4.AndroidComposeTestRule_androidKt#createAndroidComposeRule():
-    Missing nullability on method `createAndroidComposeRule` return
diff --git a/compose/ui/ui-test-junit4/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt b/compose/ui/ui-test-junit4/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt
index f820217..1195ad9 100644
--- a/compose/ui/ui-test-junit4/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt
+++ b/compose/ui/ui-test-junit4/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt
@@ -38,6 +38,8 @@
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.ExperimentalComposeApi
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -59,9 +61,14 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
 import kotlin.coroutines.CoroutineContext
 import kotlin.math.roundToInt
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Runnable
+import kotlinx.coroutines.test.StandardTestDispatcher
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
@@ -73,7 +80,7 @@
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-@OptIn(ExperimentalTestApi::class)
+@OptIn(ExperimentalTestApi::class, ExperimentalComposeApi::class, ExperimentalCoroutinesApi::class)
 class ComposeUiTestTest {
 
     private var idlingPolicy: IdlingPolicy? = null
@@ -369,6 +376,103 @@
         }
     }
 
+    @Test
+    fun customDispatcher_ignoredWhenNotSubclassOfTestDispatcher() {
+        class CustomNonTestDispatcher : CoroutineDispatcher() {
+            private var queuedTasks = mutableListOf<Runnable>()
+            override fun dispatch(context: CoroutineContext, block: Runnable) {
+                queuedTasks.add(block)
+            }
+
+            fun runQueuedTasks() {
+                val tasksToRun = queuedTasks
+                queuedTasks = mutableListOf()
+                tasksToRun.forEach {
+                    it.run()
+                }
+            }
+        }
+
+        val customDispatcher = CustomNonTestDispatcher()
+
+        var expectCounter = 0
+        fun expect(value: Int) {
+            assertWithMessage("Expected sequence")
+                .that(expectCounter)
+                .isEqualTo(value)
+            expectCounter++
+        }
+
+        runComposeUiTest(effectContext = customDispatcher) {
+            setContent {
+                LaunchedEffect(Unit) {
+                    expect(2)
+                    withFrameNanos {
+                        expect(4)
+                    }
+                    expect(6)
+                }
+            }
+            expect(0)
+
+            // None of these will actually start the effect, because we control tasks.
+            waitForIdle()
+            mainClock.advanceTimeByFrame()
+            waitForIdle()
+            expect(1)
+
+            // This will actually start the effect.
+            customDispatcher.runQueuedTasks()
+            expect(3)
+
+            // This runs the first withFrameNanos.
+            mainClock.advanceTimeByFrame()
+            expect(5)
+
+            // And this resumes the effect coroutine after withFrameNanos.
+            customDispatcher.runQueuedTasks()
+            expect(7)
+        }
+    }
+
+    @Test
+    fun customDispatcher_usedWhenSubclassesTestDispatcher() {
+        var expectCounter = 0
+        fun expect(value: Int) {
+            assertWithMessage("Expected sequence")
+                .that(expectCounter)
+                .isEqualTo(value)
+            expectCounter++
+        }
+
+        val customDispatcher = StandardTestDispatcher()
+
+        // TestDispatcher has an internal constructor so we can't make our own subclass.
+        // StandardTestDispatcher was the only other subclass of TestDispatcher at the time this
+        // test was initially written.
+        runComposeUiTest(effectContext = customDispatcher) {
+            setContent {
+                LaunchedEffect(Unit) {
+                    expect(2)
+                    withFrameNanos {
+                        expect(3)
+                    }
+                    expect(4)
+                }
+            }
+            expect(0)
+
+            // This won't wait for the effect to launch…
+            waitForIdle()
+            expect(1)
+
+            // …but this will, because Compose detected the custom TestDispatcher and wired the
+            // clock to it.
+            mainClock.advanceTimeByFrame()
+            expect(5)
+        }
+    }
+
     private class TestCoroutineContextElement : CoroutineContext.Element {
         override val key: CoroutineContext.Key<*> get() = Key
 
diff --git a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/ComposeUiTest.android.kt b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/ComposeUiTest.android.kt
index 09198ee..33af8ea 100644
--- a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/ComposeUiTest.android.kt
+++ b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/ComposeUiTest.android.kt
@@ -42,6 +42,7 @@
 import androidx.compose.ui.unit.Density
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
+import kotlin.coroutines.ContinuationInterceptor
 import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.EmptyCoroutineContext
 import kotlinx.coroutines.CancellationException
@@ -50,6 +51,7 @@
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.TestDispatcher
 import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.UnconfinedTestDispatcher
 import kotlinx.coroutines.test.runTest
@@ -239,7 +241,9 @@
     private var idlingStrategy: IdlingStrategy = EspressoLink(idlingResourceRegistry)
 
     private val recomposer: Recomposer
-    private val testCoroutineDispatcher = UnconfinedTestDispatcher()
+    // We can only accept a TestDispatcher here because we need to access its scheduler.
+    private val testCoroutineDispatcher = effectContext[ContinuationInterceptor] as? TestDispatcher
+        ?: UnconfinedTestDispatcher()
     private val testCoroutineScope = TestScope(testCoroutineDispatcher)
     private val recomposerCoroutineScope: CoroutineScope
     private val coroutineExceptionHandler = UncaughtExceptionHandler()
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/PlatformTextInputMethodOverride.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/PlatformTextInputMethodOverride.kt
index 63f667a..01d1e84 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/PlatformTextInputMethodOverride.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/PlatformTextInputMethodOverride.kt
@@ -24,13 +24,13 @@
 import androidx.compose.ui.InternalComposeUiApi
 import androidx.compose.ui.SessionMutex
 import androidx.compose.ui.platform.LocalPlatformTextInputMethodOverride
+import androidx.compose.ui.platform.PlatformTextInputMethodRequest
 import androidx.compose.ui.platform.PlatformTextInputModifierNode
 import androidx.compose.ui.platform.PlatformTextInputSession
 import androidx.compose.ui.platform.PlatformTextInputSessionHandler
 import androidx.compose.ui.platform.PlatformTextInputSessionScope
-import androidx.compose.ui.platform.textInputSession
+import androidx.compose.ui.platform.runTextInputSession
 import androidx.compose.ui.test.PlatformTextInputMethodOverride.OverrideSession
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.job
@@ -65,7 +65,7 @@
  *
  * Note: This class implements [RememberObserver], and MUST NOT be exposed publicly where it could
  * be remembered externally in a composition. It should ONLY be exposed as the receiver to
- * [PlatformTextInputModifierNode.textInputSession].
+ * [PlatformTextInputModifierNode.runTextInputSession].
  */
 @OptIn(InternalComposeUiApi::class)
 @Stable
diff --git a/compose/ui/ui-text/api/api_lint.ignore b/compose/ui/ui-text/api/api_lint.ignore
index 734b4f8..2515e64 100644
--- a/compose/ui/ui-text/api/api_lint.ignore
+++ b/compose/ui/ui-text/api/api_lint.ignore
@@ -41,8 +41,6 @@
     Invalid name for boolean property `didExceedMaxLines`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field Paragraph.didExceedMaxLines:
     Invalid name for boolean property `didExceedMaxLines`. Should start with one of `has`, `can`, `should`, `is`.
-GetterSetterNames: field PlatformParagraphStyle.includeFontPadding:
-    Invalid name for boolean property `includeFontPadding`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field TextLayoutInput.softWrap:
     Invalid name for boolean property `softWrap`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field TextLayoutResult.didOverflowHeight:
diff --git a/compose/ui/ui-text/api/current.txt b/compose/ui/ui-text/api/current.txt
index bda3926..abf54b5 100644
--- a/compose/ui/ui-text/api/current.txt
+++ b/compose/ui/ui-text/api/current.txt
@@ -799,7 +799,7 @@
   }
 
   @kotlin.jvm.JvmInline public final value class FontStyle {
-    ctor public FontStyle(int value);
+    ctor @Deprecated public FontStyle(int value);
     method public int getValue();
     property public final int value;
     field public static final androidx.compose.ui.text.font.FontStyle.Companion Companion;
@@ -1142,10 +1142,6 @@
   public sealed interface PlatformImeOptions {
   }
 
-  public fun interface PlatformTextInputMethodRequest {
-    method public android.view.inputmethod.InputConnection createInputConnection(android.view.inputmethod.EditorInfo outAttrs);
-  }
-
   public interface PlatformTextInputService {
     method public void hideSoftwareKeyboard();
     method public default void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
diff --git a/compose/ui/ui-text/api/restricted_current.txt b/compose/ui/ui-text/api/restricted_current.txt
index bda3926..abf54b5 100644
--- a/compose/ui/ui-text/api/restricted_current.txt
+++ b/compose/ui/ui-text/api/restricted_current.txt
@@ -799,7 +799,7 @@
   }
 
   @kotlin.jvm.JvmInline public final value class FontStyle {
-    ctor public FontStyle(int value);
+    ctor @Deprecated public FontStyle(int value);
     method public int getValue();
     property public final int value;
     field public static final androidx.compose.ui.text.font.FontStyle.Companion Companion;
@@ -1142,10 +1142,6 @@
   public sealed interface PlatformImeOptions {
   }
 
-  public fun interface PlatformTextInputMethodRequest {
-    method public android.view.inputmethod.InputConnection createInputConnection(android.view.inputmethod.EditorInfo outAttrs);
-  }
-
   public interface PlatformTextInputService {
     method public void hideSoftwareKeyboard();
     method public default void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.android.kt
deleted file mode 100644
index 1e8f4f3..0000000
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.android.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.input
-
-import android.view.View
-import android.view.inputmethod.EditorInfo
-import android.view.inputmethod.InputConnection
-
-/**
- * Represents a request to open an Android text input session via
- * `PlatformTextInputSession.startInputMethod`.
- */
-actual fun interface PlatformTextInputMethodRequest {
-
-    /**
-     * Called when the platform requests an [InputConnection] via [View.onCreateInputConnection].
-     *
-     * This method makes stricter ordering guarantees about the lifetime of the returned
-     * [InputConnection] than Android does, to make working with connections simpler. Namely, it
-     * guarantees:
-     *  - For a given [PlatformTextInputMethodRequest] instance, only one [InputConnection] will
-     *    ever be active at a time.
-     *  - References to an [InputConnection] will be cleared as soon as the connection becomes
-     *    inactive. Even if Android leaks its reference to the connection, the connection returned
-     *    from this method will not be leaked.
-     *  - On API levels that support [InputConnection.closeConnection] (24+), a connection will
-     *    always be closed before a new connection is requested.
-     *
-     * Android may call [View.onCreateInputConnection] multiple times for the same session – each
-     * system call will result in a 1:1 call to this method, although the old connection will always
-     * be closed first.
-     *
-     * @param outAttrs The [EditorInfo] from [View.onCreateInputConnection].
-     *
-     * @return The [InputConnection] that will be used to talk to the IME as long as the session is
-     * active. This connection will not receive any calls after the requesting coroutine is
-     * cancelled.
-     */
-    fun createInputConnection(outAttrs: EditorInfo): InputConnection
-}
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/ShaderBrushSpan.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/ShaderBrushSpan.android.kt
index f677724db..86f0f50 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/ShaderBrushSpan.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/style/ShaderBrushSpan.android.kt
@@ -20,6 +20,11 @@
 import android.text.TextPaint
 import android.text.style.CharacterStyle
 import android.text.style.UpdateAppearance
+import androidx.compose.runtime.State
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.geometry.isUnspecified
 import androidx.compose.ui.graphics.ShaderBrush
@@ -32,25 +37,19 @@
     val shaderBrush: ShaderBrush,
     val alpha: Float
 ) : CharacterStyle(), UpdateAppearance {
-    var size: Size = Size.Unspecified
-    private var cachedShader: Pair<Size, Shader>? = null
+
+    var size: Size by mutableStateOf(Size.Unspecified)
+
+    private val shaderState: State<Shader?> = derivedStateOf {
+        if (size.isUnspecified || size.isEmpty()) {
+            null
+        } else {
+            shaderBrush.createShader(size)
+        }
+    }
 
     override fun updateDrawState(textPaint: TextPaint) {
         textPaint.setAlpha(alpha)
-
-        if (size.isUnspecified) return
-
-        val finalCachedShader = cachedShader
-
-        val shader = if (finalCachedShader == null || finalCachedShader.first != size) {
-            // if cached shader is not initialized or the size has changed, recreate the shader
-            shaderBrush.createShader(size)
-        } else {
-            // reuse the earlier created shader
-            finalCachedShader.second
-        }
-
-        textPaint.shader = shader
-        cachedShader = size to shader
+        textPaint.shader = shaderState.value
     }
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontStyle.kt
index f37c520..2153ff2 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontStyle.kt
@@ -21,9 +21,13 @@
  *  @see Font
  *  @see FontFamily
  */
-// TODO(b/205312869) This constructor should not be public as it leads to FontStyle([cursor]) in AS
 @kotlin.jvm.JvmInline
-value class FontStyle(val value: Int) {
+value class FontStyle
+@Deprecated(
+    "Please use FontStyle.Normal or FontStyle.Italic",
+    replaceWith = ReplaceWith("FontStyle.")
+)
+constructor(val value: Int) {
 
     override fun toString(): String {
         return when (this) {
@@ -35,9 +39,11 @@
 
     companion object {
         /** Use the upright glyphs */
+        @Suppress("DEPRECATION")
         val Normal = FontStyle(0)
 
         /** Use glyphs designed for slanting */
+        @Suppress("DEPRECATION")
         val Italic = FontStyle(1)
 
         /** Returns a list of possible values of [FontStyle]. */
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.kt
deleted file mode 100644
index 4dcc7fa..0000000
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.input
-
-/**
- * Represents a request to open a platform-specific text input session via
- * `PlatformTextInputModifierNode.textInputSession`.
- */
-expect interface PlatformTextInputMethodRequest
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.desktop.kt
deleted file mode 100644
index 503015a..0000000
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodRequest.desktop.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.input
-
-import java.awt.Component
-import java.awt.event.InputMethodListener
-import java.awt.im.InputMethodRequests
-
-/**
- * Represents a request to open a desktop text input session via
- * `PlatformTextInputModifierNode.textInputSession`.
- */
-actual interface PlatformTextInputMethodRequest {
-    /**
-     * The [InputMethodListener] that will be registered via [Component.addInputMethodListener]
-     * while the session is active.
-     */
-    val inputMethodListener: InputMethodListener
-
-    /**
-     * The [InputMethodRequests] that will be returned from the Compose host's
-     * [Component.getInputMethodRequests] while the session is active.
-     */
-    val inputMethodRequests: InputMethodRequests
-}
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
index a63a2c0..27494ed 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
@@ -446,6 +446,34 @@
     }
 
     @Test
+    fun animationIsFoundWithoutClock() {
+        findAnimationWithoutClock("AllAnimations")
+    }
+
+    @Test
+    fun materialAnimationIsFoundWithoutClock() {
+        findAnimationWithoutClock("MaterialPreview")
+    }
+
+    private fun findAnimationWithoutClock(preview: String) {
+        activityTestRule.runOnUiThread {
+            composeViewAdapter.init(
+                "androidx.compose.ui.tooling.TestAnimationPreviewKt",
+                preview
+            )
+            assertFalse(composeViewAdapter.hasAnimations())
+        }
+
+        waitFor(5, TimeUnit.SECONDS) {
+            // Handle the case where onLayout was called too soon. Calling requestLayout will
+            // make sure onLayout will be called again.
+            composeViewAdapter.requestLayout()
+            composeViewAdapter.hasAnimations()
+        }
+        assertTrue(composeViewAdapter.hasAnimations())
+    }
+
+    @Test
     fun lineNumberMapping() {
         val viewInfos = assertRendersCorrectly(
             "androidx.compose.ui.tooling.LineNumberPreviewKt",
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimationTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimationTest.kt
index 2cb84f5..c9658a2 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimationTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimateXAsStateComposeAnimationTest.kt
@@ -35,7 +35,8 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.tooling.animation.AnimateXAsStateComposeAnimation.Companion.parse
-import androidx.compose.ui.tooling.animation.Utils.searchForAnimation
+import androidx.compose.ui.tooling.animation.Utils.addAnimations
+import androidx.compose.ui.tooling.animation.Utils.hasAnimations
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
@@ -59,9 +60,9 @@
 
     @Test
     fun dpAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var dpState: State<Dp>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             dpState = animateDpAsState(targetValue = 10.dp)
         }
         val composeAnimation = checkDefaultState(search, "DpAnimation", 10.dp)
@@ -74,9 +75,9 @@
 
     @Test
     fun floatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Float>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateFloatAsState(targetValue = 10f)
         }
         val composeAnimation = checkDefaultState(search, "FloatAnimation", 10f)
@@ -89,9 +90,9 @@
 
     @Test
     fun intAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Int>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateIntAsState(targetValue = 10)
         }
         val composeAnimation = checkDefaultState(search, "IntAnimation", 10)
@@ -104,9 +105,9 @@
 
     @Test
     fun intSizeAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<IntSize>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateIntSizeAsState(targetValue = IntSize(10, 20))
         }
         checkDefaultState(search, "IntSizeAnimation", IntSize(10, 20))
@@ -120,9 +121,9 @@
 
     @Test
     fun intOffsetAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<IntOffset>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateIntOffsetAsState(targetValue = IntOffset(10, 20))
         }
         val composeAnimation = checkDefaultState(search, "IntOffsetAnimation", IntOffset(10, 20))
@@ -135,9 +136,9 @@
 
     @Test
     fun offsetAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Offset>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateOffsetAsState(targetValue = Offset(10f, 20f))
         }
         val composeAnimation = checkDefaultState(search, "OffsetAnimation", Offset(10f, 20f))
@@ -150,9 +151,9 @@
 
     @Test
     fun sizeAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Size>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateSizeAsState(targetValue = Size(10f, 20f))
         }
         val composeAnimation = checkDefaultState(search, "SizeAnimation", Size(10f, 20f))
@@ -163,9 +164,9 @@
 
     @Test
     fun rectAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Rect>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateRectAsState(targetValue = Rect(10f, 20f, 30f, 40f))
         }
         val composeAnimation = checkDefaultState(search, "RectAnimation", Rect(10f, 20f, 30f, 40f))
@@ -176,9 +177,9 @@
 
     @Test
     fun colorAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Color>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateColorAsState(targetValue = Color(0.1f, 0.2f, 0.3f, 0.4f))
         }
         val composeAnimation =
@@ -190,9 +191,9 @@
 
     @Test
     fun customFloatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) {}
+        val search = AnimationSearch.AnimateXAsStateSearch {}
         var state: State<Float>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(10f, Float.VectorConverter)
         }
         val composeAnimation = checkDefaultState(search, "ValueAnimation", 10f)
@@ -203,9 +204,9 @@
 
     @Test
     fun nullableFloatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Float?>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(1f, Utils.nullableFloatConverter)
         }
         val composeAnimation = checkDefaultState(search, "ValueAnimation", 1f)
@@ -216,8 +217,8 @@
 
     @Test
     fun nullableFloatAnimationWithNullState() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.AnimateXAsStateSearch { }
+        rule.addAnimations(search) {
             animateValueAsState(null, Utils.nullableFloatConverter)
         }
         assertEquals(1, search.animations.size)
@@ -227,9 +228,9 @@
 
     @Test
     fun stringAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<String>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState("11.0", Utils.stringConverter)
         }
         val composeAnimation = checkDefaultState(search, "ValueAnimation", "11.0")
@@ -240,9 +241,9 @@
 
     @Test
     fun enumAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Utils.EnumState>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(Utils.EnumState.One, Utils.enumConverter)
         }
         val composeAnimation = checkDefaultState(search, "ValueAnimation", Utils.EnumState.One, 3)
@@ -253,9 +254,9 @@
 
     @Test
     fun nullableEnumAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Utils.EnumState?>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(Utils.EnumState.One, Utils.nullableEnumConverter)
         }
         val composeAnimation = checkDefaultState(search, "ValueAnimation", Utils.EnumState.One, 3)
@@ -265,19 +266,16 @@
     }
 
     @Test
-    fun setStateShouldOnlyWorkInAnimationPreview() {
-        val search = AnimationSearch.AnimateXAsStateSearch(false) { }
+    fun animationsAreNotCreated() {
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Int>? = null
-        rule.searchForAnimation(search) {
+        val hasAnimations = rule.hasAnimations(search) {
             state = animateIntAsState(targetValue = 10)
         }
-        val composeAnimation = checkDefaultState(search, "IntAnimation", 10)
-        rule.runOnUiThread {
-            // Setting the state while not in Animation Preview
-            composeAnimation.setState(20)
-        }
-        rule.waitForIdle()
-        // State should still be the initial value, as we're not in Animation Preview
+        assertTrue(hasAnimations)
+        // No animations were created.
+        assertTrue(search.animations.isEmpty())
+        // No changes in state
         assertEquals(10, state!!.value)
     }
 
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimationTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimationTest.kt
index e7ececc..c10cff8 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimationTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimatedContentComposeAnimationTest.kt
@@ -21,7 +21,7 @@
 import androidx.compose.material.Text
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.tooling.animation.AnimatedContentComposeAnimation.Companion.parseAnimatedContent
-import androidx.compose.ui.tooling.animation.Utils.searchForAnimation
+import androidx.compose.ui.tooling.animation.Utils.addAnimations
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -45,7 +45,7 @@
     fun parseAnimation() {
         assertTrue(AnimatedContentComposeAnimation.apiAvailable)
         val search = AnimationSearch.AnimatedContentSearch { }
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             AnimatedContent(targetState = 1.dp) { targetCount ->
                 Text(text = "Count: $targetCount")
             }
@@ -66,7 +66,7 @@
     fun parseIfApiIsNotAvailable() {
         AnimatedContentComposeAnimation.testOverrideAvailability(false)
         val search = AnimationSearch.AnimatedContentSearch { }
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             AnimatedContent(targetState = 1.dp) { targetCount ->
                 Text(text = "Count: $targetCount")
             }
@@ -79,7 +79,7 @@
     @Test
     fun parseAnimationWithNullState() {
         val search = AnimationSearch.AnimatedContentSearch { }
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             AnimatedContent(targetState = null) { targetCount ->
                 Text(text = "Count: $targetCount")
             }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimationSearchTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimationSearchTest.kt
index 982abab..ec8469e 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimationSearchTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/AnimationSearchTest.kt
@@ -19,6 +19,7 @@
 import androidx.compose.animation.core.SpringSpec
 import androidx.compose.animation.core.rememberInfiniteTransition
 import androidx.compose.animation.tooling.ComposeAnimationType
+import androidx.compose.runtime.Composable
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.tooling.AnimateAsStatePreview
 import androidx.compose.ui.tooling.AnimateAsStateWithLabelsPreview
@@ -37,8 +38,9 @@
 import androidx.compose.ui.tooling.TransitionAnimatedVisibilityPreview
 import androidx.compose.ui.tooling.TransitionPreview
 import androidx.compose.ui.tooling.animation.InfiniteTransitionComposeAnimation.Companion.parse
-import androidx.compose.ui.tooling.animation.Utils.searchAndTrackAllAnimations
-import androidx.compose.ui.tooling.animation.Utils.searchForAnimation
+import androidx.compose.ui.tooling.animation.Utils.addAnimations
+import androidx.compose.ui.tooling.animation.Utils.attachAllAnimations
+import androidx.compose.ui.tooling.animation.Utils.hasAnimations
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -58,11 +60,11 @@
     val rule = createComposeRule()
 
     @Test
-    fun targetBasedAnimationIsFound() {
+    fun targetBasedIsAddedAndTracked() {
         var callbacks = 0
         val search = AnimationSearch.TargetBasedSearch { callbacks++ }
-        rule.searchForAnimation(search) { TargetBasedAnimationPreview() }
-        assertTrue(search.hasAnimations())
+        rule.addAnimations(search) { TargetBasedAnimationPreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
@@ -70,18 +72,25 @@
     }
 
     @Test
-    fun targetBasedAnimationIsFoundButNotSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { TargetBasedAnimationPreview() }
-        assertFalse(search.hasAnimations)
+    fun targetBasedIsFound() {
+        animationIsFound(AnimationSearch.TargetBasedSearch {}) {
+            TargetBasedAnimationPreview()
+        }
     }
 
     @Test
-    fun decayAnimationIsFound() {
+    fun targetBasedAnimationIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { TargetBasedAnimationPreview() }
+        assertEquals(1, clock.trackedUnsupportedAnimations.size)
+    }
+
+    @Test
+    fun decayAnimationIsAddedAndTracked() {
         var callbacks = 0
         val search = AnimationSearch.DecaySearch { callbacks++ }
-        rule.searchForAnimation(search) { DecayAnimationPreview() }
-        assertTrue(search.hasAnimations())
+        rule.addAnimations(search) { DecayAnimationPreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
@@ -89,18 +98,25 @@
     }
 
     @Test
-    fun decayAnimationIsFoundButNotSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { DecayAnimationPreview() }
-        assertFalse(search.hasAnimations)
+    fun decayBasedIsFound() {
+        animationIsFound(AnimationSearch.DecaySearch {}) {
+            DecayAnimationPreview()
+        }
     }
 
     @Test
-    fun infiniteTransitionIsFound() {
+    fun decayAnimationIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { DecayAnimationPreview() }
+        assertEquals(1, clock.trackedUnsupportedAnimations.size)
+    }
+
+    @Test
+    fun infiniteTransitionIsAddedAndTracked() {
         var callbacks = 0
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { callbacks++ }
-        rule.searchForAnimation(search) { InfiniteTransitionPreview() }
-        assertTrue(search.hasAnimations())
+        val search = AnimationSearch.InfiniteTransitionSearch { callbacks++ }
+        rule.addAnimations(search) { InfiniteTransitionPreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
@@ -113,16 +129,23 @@
     }
 
     @Test
-    fun infiniteTransitionIsFoundAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { InfiniteTransitionPreview() }
-        assertTrue(search.hasAnimations)
+    fun infiniteTransitionIsFound() {
+        animationIsFound(AnimationSearch.InfiniteTransitionSearch {}) {
+            InfiniteTransitionPreview()
+        }
     }
 
     @Test
-    fun multipleInfiniteTransitionIsFound() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+    fun infiniteTransitionIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { InfiniteTransitionPreview() }
+        assertEquals(1, clock.infiniteTransitionClocks.size)
+    }
+
+    @Test
+    fun multipleInfiniteTransitionIsAdded() {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             rememberInfiniteTransition()
             rememberInfiniteTransition()
             rememberInfiniteTransition()
@@ -130,15 +153,15 @@
             rememberInfiniteTransition()
         }
         assertEquals(5, search.animations.size)
-        assertTrue(search.hasAnimations())
+        assertTrue(search.animations.isNotEmpty())
     }
 
     @Test
-    fun animatedXAsStateSearchIsFound() {
+    fun animatedXAsStateSearchIsAddedAndTracked() {
         var callbacks = 0
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { callbacks++ }
-        rule.searchForAnimation(search) { AnimateAsStatePreview() }
-        assertTrue(search.hasAnimations())
+        val search = AnimationSearch.AnimateXAsStateSearch { callbacks++ }
+        rule.addAnimations(search) { AnimateAsStatePreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(2, search.animations.size)
         search.animations.first().let {
             assertTrue(it.animationSpec is SpringSpec)
@@ -159,18 +182,25 @@
     }
 
     @Test
-    fun animatedXAsStateSearchIsFoundAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { AnimateAsStatePreview() }
-        assertTrue(search.hasAnimations)
+    fun animatedXAsStateIsFound() {
+        animationIsFound(AnimationSearch.AnimateXAsStateSearch {}) {
+            AnimateAsStatePreview()
+        }
     }
 
     @Test
-    fun animatedXAsStateWithLabelsSearchIsFound() {
+    fun animatedXAsStateSearchIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { AnimateAsStatePreview() }
+        assertEquals(2, clock.animateXAsStateClocks.size)
+    }
+
+    @Test
+    fun animatedXAsStateWithLabelsSearchIsAddedAndTracked() {
         var callbacks = 0
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { callbacks++ }
-        rule.searchForAnimation(search) { AnimateAsStateWithLabelsPreview() }
-        assertTrue(search.hasAnimations())
+        val search = AnimationSearch.AnimateXAsStateSearch { callbacks++ }
+        rule.addAnimations(search) { AnimateAsStateWithLabelsPreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(2, search.animations.size)
         search.animations.first().let {
             assertTrue(it.animationSpec is SpringSpec)
@@ -191,36 +221,43 @@
     }
 
     @Test
-    fun animatedXAsStateWithLabelsSearchIsFoundAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { AnimateAsStateWithLabelsPreview() }
-        assertTrue(search.hasAnimations)
+    fun animatedXAsStateWithLabelsSearchIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { AnimateAsStateWithLabelsPreview() }
+        assertEquals(2, clock.animateXAsStateClocks.size)
     }
 
     @Test
-    fun animatedContentSizeIsFound() {
+    fun animatedContentSizeIsAddedAndTracke() {
         var callbacks = 0
         val search = AnimationSearch.AnimateContentSizeSearch { callbacks++ }
-        rule.searchForAnimation(search) { AnimateContentSizePreview() }
-        assertTrue(search.hasAnimations())
+        rule.addAnimations(search) { AnimateContentSizePreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
     }
 
     @Test
-    fun animatedContentSizeIsFoundButNotSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { AnimateContentSizePreview() }
-        assertFalse(search.hasAnimations)
+    fun animatedContentSizeIsFound() {
+        animationIsFound(AnimationSearch.AnimateContentSizeSearch {}) {
+            AnimateContentSizePreview()
+        }
     }
 
     @Test
-    fun transitionIsFound() {
+    fun animatedContentSizeIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { AnimateContentSizePreview() }
+        assertEquals(1, clock.trackedUnsupportedAnimations.size)
+    }
+
+    @Test
+    fun transitionIsAddedAndTracked() {
         var callbacks = 0
         val search = AnimationSearch.TransitionSearch { callbacks++ }
-        rule.searchForAnimation(search) { TransitionPreview() }
-        assertTrue(search.hasAnimations())
+        rule.addAnimations(search) { TransitionPreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
@@ -228,24 +265,31 @@
     }
 
     @Test
-    fun transitionIsFoundAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { TransitionPreview() }
-        assertTrue(search.hasAnimations)
+    fun transitionIsFound() {
+        animationIsFound(AnimationSearch.TransitionSearch {}) {
+            TransitionPreview()
+        }
     }
 
     @Test
-    fun animatedVisibilityExtensionIsFoundAsTransition() {
+    fun transitionIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { TransitionPreview() }
+        assertEquals(1, clock.transitionClocks.size)
+    }
+
+    @Test
+    fun animatedVisibilityExtensionIsAddedAsTransition() {
         var transitionSearchCallbacks = 0
         var animatedVisibilitySearchCallbacks = 0
         val transitionSearch = AnimationSearch.TransitionSearch { transitionSearchCallbacks++ }
         val animatedVisibilitySearch =
             AnimationSearch.AnimatedVisibilitySearch { animatedVisibilitySearchCallbacks++ }
-        rule.searchForAnimation(transitionSearch, animatedVisibilitySearch) {
+        rule.addAnimations(transitionSearch, animatedVisibilitySearch) {
             TransitionAnimatedVisibilityPreview()
         }
-        assertTrue(transitionSearch.hasAnimations())
-        assertFalse(animatedVisibilitySearch.hasAnimations())
+        assertTrue(transitionSearch.animations.isNotEmpty())
+        assertFalse(animatedVisibilitySearch.animations.isNotEmpty())
         assertEquals(1, transitionSearch.animations.size)
         assertEquals(0, animatedVisibilitySearch.animations.size)
         // Track animations.
@@ -256,18 +300,25 @@
     }
 
     @Test
-    fun animatedVisibilityExtensionIsFoundAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { TransitionAnimatedVisibilityPreview() }
-        assertTrue(search.hasAnimations)
+    fun animatedVisibilityExtensionIsFound() {
+        animationIsFound(AnimationSearch.TransitionSearch {}) {
+            TransitionAnimatedVisibilityPreview()
+        }
     }
 
     @Test
-    fun crossFadeIsFoundAsTransition() {
+    fun animatedVisibilityExtensionIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { TransitionAnimatedVisibilityPreview() }
+        assertEquals(1, clock.transitionClocks.size)
+    }
+
+    @Test
+    fun crossFadeIsAddedAsTransition() {
         var callbacks = 0
         val search = AnimationSearch.TransitionSearch { callbacks++ }
-        rule.searchForAnimation(search) { CrossFadePreview() }
-        assertTrue(search.hasAnimations())
+        rule.addAnimations(search) { CrossFadePreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
@@ -276,18 +327,25 @@
     }
 
     @Test
-    fun crossFadeIsFoundAsTransitionAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { CrossFadePreview() }
-        assertTrue(search.hasAnimations)
+    fun crossFadeIsFound() {
+        animationIsFound(AnimationSearch.TransitionSearch {}) {
+            CrossFadePreview()
+        }
     }
 
     @Test
-    fun crossFadeWithLabelIsFoundAsTransition() {
+    fun crossFadeIsConnectedAsTransition() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { CrossFadePreview() }
+        assertEquals(1, clock.transitionClocks.size)
+    }
+
+    @Test
+    fun crossFadeWithLabelIsAddedAsTransition() {
         var callbacks = 0
         val search = AnimationSearch.TransitionSearch { callbacks++ }
-        rule.searchForAnimation(search) { CrossFadeWithLabelPreview() }
-        assertTrue(search.hasAnimations())
+        rule.addAnimations(search) { CrossFadeWithLabelPreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
@@ -296,18 +354,18 @@
     }
 
     @Test
-    fun crossFadeWithLabelIsFoundAsTransitionAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { CrossFadeWithLabelPreview() }
-        assertTrue(search.hasAnimations)
+    fun crossFadeWithLabelIsConnectedAsTransition() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { CrossFadeWithLabelPreview() }
+        assertEquals(1, clock.transitionClocks.size)
     }
 
     @Test
-    fun animatedVisibilityIsFound() {
+    fun animatedVisibilityIsAdded() {
         var callbacks = 0
         val search = AnimationSearch.AnimatedVisibilitySearch { callbacks++ }
-        rule.searchForAnimation(search) { AnimatedVisibilityPreview() }
-        assertTrue(search.hasAnimations())
+        rule.addAnimations(search) { AnimatedVisibilityPreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
@@ -315,18 +373,25 @@
     }
 
     @Test
-    fun animatedVisibilityIsFoundAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { AnimatedVisibilityPreview() }
-        assertTrue(search.hasAnimations)
+    fun animatedVisibilityIsFoundd() {
+        animationIsFound(AnimationSearch.AnimatedVisibilitySearch {}) {
+            AnimatedVisibilityPreview()
+        }
     }
 
     @Test
-    fun animatedContentIsFound() {
+    fun animatedVisibilityIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { AnimatedVisibilityPreview() }
+        assertEquals(1, clock.animatedVisibilityClocks.size)
+    }
+
+    @Test
+    fun animatedContentIsAdded() {
         var callbacks = 0
         val search = AnimationSearch.AnimatedContentSearch { callbacks++ }
-        rule.searchForAnimation(search) { AnimatedContentPreview() }
-        assertTrue(search.hasAnimations())
+        rule.addAnimations(search) { AnimatedContentPreview() }
+        assertTrue(search.animations.isNotEmpty())
         assertEquals(1, search.animations.size)
         search.track()
         assertEquals(1, callbacks)
@@ -334,51 +399,55 @@
     }
 
     @Test
-    fun animatedContentIsFoundAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { AnimatedContentPreview() }
-        assertTrue(search.hasAnimations)
+    fun animatedContentIsFound() {
+        animationIsFound(AnimationSearch.AnimatedContentSearch {}) {
+            AnimatedContentPreview()
+        }
     }
 
     @Test
-    fun nullAnimatedContentIsTrackedAsUnsupported() {
+    fun animatedContentIsConnected() {
+        val clock = PreviewAnimationClock {}
+        rule.attachAllAnimations(clock) { AnimatedContentPreview() }
+        assertEquals(1, clock.animatedContentClocks.size)
+    }
+
+    @Test
+    fun nullAnimatedContentIsConnectedAsUnsupported() {
         val clock = PreviewAnimationClock()
-        val search = AnimationSearch({ clock }, true) { }
-        rule.searchAndTrackAllAnimations(search) { NullAnimatedContentPreview() }
+        rule.attachAllAnimations(clock) { NullAnimatedContentPreview() }
         assertEquals(1, clock.trackedUnsupportedAnimations.size)
         assertTrue(clock.animatedContentClocks.isEmpty())
     }
 
     @Test
-    fun nullAnimatedXAsStateIsTrackedAsUnsupported() {
+    fun nullAnimatedXAsStateIsConnectedAsUnsupported() {
         val clock = PreviewAnimationClock()
-        val search = AnimationSearch({ clock }, true) { }
-        rule.searchAndTrackAllAnimations(search) { NullAnimateAsStatePreview() }
+        rule.attachAllAnimations(clock) { NullAnimateAsStatePreview() }
         assertEquals(1, clock.trackedUnsupportedAnimations.size)
         assertTrue(clock.animateXAsStateClocks.isEmpty())
     }
 
     @Test
-    fun nullTransitionIsTrackedAsUnsupported() {
+    fun nullTransitionIsConnectedAsUnsupported() {
         val clock = PreviewAnimationClock()
-        val search = AnimationSearch({ clock }, true) { }
-        rule.searchAndTrackAllAnimations(search) { NullTransitionPreview() }
+        rule.attachAllAnimations(clock) { NullTransitionPreview() }
         assertEquals(1, clock.trackedUnsupportedAnimations.size)
         assertTrue(clock.transitionClocks.isEmpty())
     }
 
     @Test
-    fun animatedContentExtensionIsFoundAsTransition() {
+    fun animatedContentExtensionIsAddedAsTransition() {
         var transitionCallbacks = 0
         var animatedContentCallbacks = 0
         val transitionSearch = AnimationSearch.TransitionSearch { transitionCallbacks++ }
         val animatedContentSearch =
             AnimationSearch.AnimatedContentSearch { animatedContentCallbacks++ }
-        rule.searchForAnimation(transitionSearch, animatedContentSearch) {
+        rule.addAnimations(transitionSearch, animatedContentSearch) {
             AnimatedContentExtensionPreview()
         }
-        assertTrue(transitionSearch.hasAnimations())
-        assertFalse(animatedContentSearch.hasAnimations())
+        assertTrue(transitionSearch.animations.isNotEmpty())
+        assertFalse(animatedContentSearch.animations.isNotEmpty())
         assertEquals(1, transitionSearch.animations.size)
         assertEquals(0, animatedContentSearch.animations.size)
         transitionSearch.track()
@@ -389,8 +458,17 @@
 
     @Test
     fun animatedContentExtensionIsFoundAsTransitionAndSupported() {
-        val search = AnimationSearch({ PreviewAnimationClock {} }, true) { }
-        rule.searchAndTrackAllAnimations(search) { AnimatedContentExtensionPreview() }
-        assertTrue(search.hasAnimations)
+        val clock = PreviewAnimationClock()
+        rule.attachAllAnimations(clock) { AnimatedContentExtensionPreview() }
+        assertEquals(1, clock.transitionClocks.size)
+    }
+
+    private fun animationIsFound(
+        search: AnimationSearch.Search<*>,
+        content: @Composable () -> Unit
+    ) {
+        val hasAnimations = rule.hasAnimations(search) { content() }
+        assertTrue(hasAnimations)
+        assertFalse(search.animations.isNotEmpty())
     }
 }
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
index 1c79afb..0fe39de 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClockTest.kt
@@ -43,7 +43,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.tooling.animation.Utils.searchAndTrackAllAnimations
+import androidx.compose.ui.tooling.animation.Utils.attachAllAnimations
 import androidx.compose.ui.tooling.animation.states.AnimatedVisibilityState
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
@@ -504,8 +504,7 @@
 
     @Test
     fun clockWithInfiniteTransition() {
-        val search = AnimationSearch({ testClock }, false) {}
-        composeRule.searchAndTrackAllAnimations(search) {
+        composeRule.attachAllAnimations(testClock) {
             // Transition with duration 1000
             val transition = updateTransition(targetState = 10, label = "updateTransition")
             transition.animateDp(
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/Utils.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/Utils.kt
index c91edb6..96079e7 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/Utils.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/Utils.kt
@@ -73,7 +73,7 @@
     }
 
     @OptIn(UiToolingDataApi::class)
-    internal fun ComposeContentTestRule.searchForAnimation(
+    internal fun ComposeContentTestRule.addAnimations(
         search: AnimationSearch.Search<*>,
         additionalSearch: AnimationSearch.Search<*>? = null,
         content: @Composable () -> Unit
@@ -94,10 +94,30 @@
     }
 
     @OptIn(UiToolingDataApi::class)
-    internal fun ComposeContentTestRule.searchAndTrackAllAnimations(
-        search: AnimationSearch,
+    internal fun ComposeContentTestRule.hasAnimations(
+        search: AnimationSearch.Search<*>,
+        content: @Composable () -> Unit
+    ): Boolean {
+        val slotTableRecord = CompositionDataRecord.create()
+        this.setContent {
+            Inspectable(slotTableRecord) {
+                content()
+            }
+        }
+        return this.runOnIdle {
+            val groups = slotTableRecord.store.map {
+                it.asTree()
+            }.flatMap { tree -> tree.findAll { true } }
+            search.hasAnimations(groups)
+        }
+    }
+
+    @OptIn(UiToolingDataApi::class)
+    internal fun ComposeContentTestRule.attachAllAnimations(
+        clock: PreviewAnimationClock,
         content: @Composable () -> Unit
     ) {
+        val search = AnimationSearch({ clock }) { }
         val slotTableRecord = CompositionDataRecord.create()
         this.setContent {
             Inspectable(slotTableRecord) {
@@ -106,9 +126,8 @@
         }
         this.runOnUiThread {
             val groups = slotTableRecord.store.map { it.asTree() }
-                .flatMap { tree -> tree.findAll { it.location != null } }
-            search.findAll(groups)
-            search.trackAll()
+                .flatMap { tree -> tree.findAll { true } }
+            search.attachAllAnimations(groups)
         }
     }
 
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClockTest.kt
index 802bcc3..80ee278 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/AnimateXAsStateClockTest.kt
@@ -39,7 +39,7 @@
 import androidx.compose.ui.tooling.animation.AnimateXAsStateComposeAnimation.Companion.parse
 import androidx.compose.ui.tooling.animation.AnimationSearch
 import androidx.compose.ui.tooling.animation.Utils
-import androidx.compose.ui.tooling.animation.Utils.searchForAnimation
+import androidx.compose.ui.tooling.animation.Utils.addAnimations
 import androidx.compose.ui.tooling.animation.states.ComposeAnimationState
 import androidx.compose.ui.tooling.animation.states.TargetState
 import androidx.compose.ui.unit.Dp
@@ -62,9 +62,9 @@
 
     @Test
     fun dpAnimationClock() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Dp>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateDpAsState(
                 targetValue = 10.dp, animationSpec = TweenSpec(durationMillis = 100)
             )
@@ -103,9 +103,9 @@
 
     @Test
     fun floatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch { }
         var state: State<Float>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateFloatAsState(
                 targetValue = 10f, animationSpec = TweenSpec(durationMillis = 100)
             )
@@ -138,9 +138,9 @@
 
     @Test
     fun intSizeAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<IntSize>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateIntSizeAsState(
                 targetValue = IntSize(10, 20),
                 animationSpec = TweenSpec(durationMillis = 100)
@@ -177,9 +177,9 @@
 
     @Test
     fun intAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Int>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateIntAsState(
                 targetValue = 10, animationSpec = TweenSpec(durationMillis = 100)
             )
@@ -213,9 +213,9 @@
 
     @Test
     fun intOffsetAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<IntOffset>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateIntOffsetAsState(
                 targetValue = IntOffset(10, 20),
                 animationSpec = TweenSpec(durationMillis = 100)
@@ -252,9 +252,9 @@
 
     @Test
     fun offsetAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Offset>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateOffsetAsState(
                 targetValue = Offset(10f, 20f),
                 animationSpec = TweenSpec(durationMillis = 100)
@@ -291,9 +291,9 @@
 
     @Test
     fun sizeAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Size>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateSizeAsState(
                 targetValue = Size(10f, 20f),
                 animationSpec = TweenSpec(durationMillis = 100)
@@ -330,9 +330,9 @@
 
     @Test
     fun rectAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Rect>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateRectAsState(
                 targetValue = Rect(10f, 20f, 30f, 40f),
                 animationSpec = TweenSpec(durationMillis = 100)
@@ -380,9 +380,9 @@
 
     @Test
     fun colorAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Color>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateColorAsState(
                 targetValue = Color.Black,
                 animationSpec = TweenSpec(durationMillis = 100)
@@ -424,9 +424,9 @@
 
     @Test
     fun customFloatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Float>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(
                 targetValue = 10f,
                 Float.VectorConverter,
@@ -462,9 +462,9 @@
 
     @Test
     fun nullableFloatAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Float?>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(
                 targetValue = 10f,
                 Utils.nullableFloatConverter,
@@ -500,9 +500,9 @@
 
     @Test
     fun stringAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<String>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(
                 targetValue = "10.0",
                 Utils.stringConverter,
@@ -538,9 +538,9 @@
 
     @Test
     fun enumAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Utils.EnumState>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(
                 targetValue = Utils.EnumState.One,
                 Utils.enumConverter,
@@ -555,9 +555,9 @@
 
     @Test
     fun booleanAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Boolean>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(
                 targetValue = false,
                 Utils.booleanConverter,
@@ -593,9 +593,9 @@
 
     @Test
     fun nullableEnumAnimation() {
-        val search = AnimationSearch.AnimateXAsStateSearch(true) { }
+        val search = AnimationSearch.AnimateXAsStateSearch() { }
         var state: State<Utils.EnumState?>? = null
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             state = animateValueAsState(
                 targetValue = Utils.EnumState.One,
                 Utils.nullableEnumConverter,
@@ -608,26 +608,6 @@
             composeState = { state!!.value!! })
     }
 
-    @Test
-    fun setStateParametersIgnoredWhenNotInAnimationPreview() {
-        val search = AnimationSearch.AnimateXAsStateSearch(false) { }
-        var state: State<Int>? = null
-        rule.searchForAnimation(search) {
-            state = animateIntAsState(
-                targetValue = 10, animationSpec = TweenSpec(durationMillis = 100)
-            )
-        }
-        val composeState = { state!!.value }
-        val clock = AnimateXAsStateClock(search.animations.first().parse()!!)
-        checkInitialState(clock, label = "IntAnimation",
-            initialValue = 10,
-            composeState = composeState)
-        rule.runOnUiThread { clock.setStateParameters(1, 2) }
-        rule.waitForIdle()
-        // State hasn't changed, because we're not in Animation Preview
-        assertEquals(10, composeState())
-    }
-
     private fun <T : ComposeAnimation, TState : ComposeAnimationState, V : Any>
         checkInitialState(
         clock: ComposeAnimationClock<T, TState>,
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClockTest.kt
index 491422a..d65df91 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/InfiniteTransitionClockTest.kt
@@ -28,8 +28,8 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.tooling.animation.AnimationSearch
 import androidx.compose.ui.tooling.animation.InfiniteTransitionComposeAnimation.Companion.parse
+import androidx.compose.ui.tooling.animation.Utils.addAnimations
 import androidx.compose.ui.tooling.animation.Utils.nullableFloatConverter
-import androidx.compose.ui.tooling.animation.Utils.searchForAnimation
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import org.junit.Assert.assertEquals
@@ -47,8 +47,8 @@
 
     @Test
     fun checkAnimatedPropertiesForAnimateFloat() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
                 0.2f, 2.1f, infiniteRepeatable(tween(300), RepeatMode.Reverse), label = "Test label"
@@ -67,8 +67,8 @@
 
     @Test
     fun checkAnimatedPropertiesForAnimateValue() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateValue(
                 30,
@@ -91,8 +91,8 @@
 
     @Test
     fun checkAnimatedPropertiesForAnimateColor() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateColor(
                 Color.Red,
@@ -114,8 +114,8 @@
 
     @Test
     fun checkAnimatedPropertiesForNullableAnimateValue() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateValue(
                 30f,
@@ -138,8 +138,8 @@
 
     @Test
     fun checkTransitions() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
                 0.2f,
@@ -197,8 +197,8 @@
 
     @Test
     fun checkNullableTransitions() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateValue(
                 30f,
@@ -226,8 +226,8 @@
 
     @Test
     fun checkDurationOfReverseAnimation() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
                 0f, 1f,
@@ -243,8 +243,8 @@
 
     @Test
     fun checkDurationOfRestartAnimation() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
                 0f, 1f,
@@ -260,8 +260,8 @@
 
     @Test
     fun maxDurationIsCorrect() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
                 0f, 1f,
@@ -285,8 +285,8 @@
 
     @Test
     fun maxDurationFromOtherAnimations() {
-        val search = AnimationSearch.InfiniteTransitionSearch(true) { }
-        rule.searchForAnimation(search) {
+        val search = AnimationSearch.InfiniteTransitionSearch { }
+        rule.addAnimations(search) {
             val infiniteTransition = rememberInfiniteTransition()
             infiniteTransition.animateFloat(
                 0f, 1f,
diff --git a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
index 5377348..bffd5f9 100644
--- a/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
+++ b/compose/ui/ui-tooling/src/androidInstrumentedTest/kotlin/androidx/compose/ui/tooling/animation/clock/TransitionClockTest.kt
@@ -38,7 +38,7 @@
 import androidx.compose.ui.tooling.animation.AnimatedContentComposeAnimation.Companion.parseAnimatedContent
 import androidx.compose.ui.tooling.animation.AnimationSearch
 import androidx.compose.ui.tooling.animation.TransitionComposeAnimation
-import androidx.compose.ui.tooling.animation.Utils.searchForAnimation
+import androidx.compose.ui.tooling.animation.Utils.addAnimations
 import androidx.compose.ui.tooling.animation.parse
 import androidx.compose.ui.tooling.animation.states.ComposeAnimationState
 import androidx.compose.ui.tooling.animation.states.TargetState
@@ -489,7 +489,7 @@
     @Test
     fun childTransition() {
         val search = AnimationSearch.TransitionSearch { }
-        rule.searchForAnimation(search) { childTransitions() }
+        rule.addAnimations(search) { childTransitions() }
         val clock = TransitionClock(search.animations.first().parse()!!)
 
         rule.runOnIdle {
@@ -555,7 +555,7 @@
     fun animatedContentClockState() {
         val search = AnimationSearch.AnimatedContentSearch { }
         val target = mutableStateOf<Dp?>(null)
-        rule.searchForAnimation(search) { AnimatedContent(1.dp) { target.value = it } }
+        rule.addAnimations(search) { AnimatedContent(1.dp) { target.value = it } }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
         rule.runOnIdle {
             clock.setStateParameters(10.dp, 10.dp)
@@ -578,7 +578,7 @@
     fun animatedContentClockStateAsList() {
         val search = AnimationSearch.AnimatedContentSearch { }
         val target = mutableStateOf<IntSize?>(null)
-        rule.searchForAnimation(search) { AnimatedContent(IntSize(10, 10)) { target.value = it } }
+        rule.addAnimations(search) { AnimatedContent(IntSize(10, 10)) { target.value = it } }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
         rule.runOnIdle {
             clock.setStateParameters(listOf(20, 30), listOf(40, 50))
@@ -593,7 +593,7 @@
     @Test
     fun animatedContentClockProperties() {
         val search = AnimationSearch.AnimatedContentSearch { }
-        rule.searchForAnimation(search) { AnimatedContent(1.dp) {} }
+        rule.addAnimations(search) { AnimatedContent(1.dp) {} }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
         rule.runOnIdle {
             clock.setStateParameters(10.dp, 10.dp)
@@ -611,7 +611,7 @@
     @Test
     fun animatedContentClockTransitions() {
         val search = AnimationSearch.AnimatedContentSearch { }
-        rule.searchForAnimation(search) { AnimatedContent(1.dp) {} }
+        rule.addAnimations(search) { AnimatedContent(1.dp) {} }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
         rule.runOnIdle {
             clock.setStateParameters(10.dp, 10.dp)
@@ -645,7 +645,7 @@
     @Test
     fun animatedContentClockDuration() {
         val search = AnimationSearch.AnimatedContentSearch { }
-        rule.searchForAnimation(search) {
+        rule.addAnimations(search) {
             AnimatedContent(targetState = 1.dp) {}
         }
         val clock = TransitionClock(search.animations.first().parseAnimatedContent()!!)
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
index b1a1802..7149b0b 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
@@ -315,11 +315,10 @@
     private fun findAndTrackAnimations() {
         val slotTrees = slotTableRecord.store.map { it.asTree() }
         val isAnimationPreview = ::clock.isInitialized
-        AnimationSearch(::clock, isAnimationPreview, ::requestLayout).let {
-            it.findAll(slotTrees)
-            hasAnimations = it.hasAnimations
-            if (isAnimationPreview) {
-                it.trackAll()
+        AnimationSearch(::clock, ::requestLayout).let {
+            hasAnimations = it.searchAny(slotTrees)
+            if (isAnimationPreview && hasAnimations) {
+                it.attachAllAnimations(slotTrees)
             }
         }
     }
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimationSearch.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimationSearch.kt
index 774f1ef..040399b 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimationSearch.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/AnimationSearch.kt
@@ -41,7 +41,7 @@
 private const val REMEMBER_INFINITE_TRANSITION = "rememberInfiniteTransition"
 private const val REMEMBER_UPDATED_STATE = "rememberUpdatedState"
 private const val SIZE_ANIMATION_MODIFIER =
-        "androidx.compose.animation.SizeAnimationModifierElement"
+    "androidx.compose.animation.SizeAnimationModifierElement"
 
 /** Find first data with type [T] within all remember calls. */
 @OptIn(UiToolingDataApi::class)
@@ -74,7 +74,6 @@
 @OptIn(UiToolingDataApi::class)
 internal class AnimationSearch(
     private val clock: () -> PreviewAnimationClock,
-    private val isAnimationPreview: Boolean,
     private val onSeek: () -> Unit,
 ) {
     private val transitionSearch = TransitionSearch { clock().trackTransition(it) }
@@ -86,12 +85,12 @@
 
     private fun animateXAsStateSearch() =
         if (AnimateXAsStateComposeAnimation.apiAvailable)
-            setOf(AnimateXAsStateSearch(isAnimationPreview) { clock().trackAnimateXAsState(it) })
+            setOf(AnimateXAsStateSearch() { clock().trackAnimateXAsState(it) })
         else emptyList()
 
     private fun infiniteTransitionSearch() =
         if (InfiniteTransitionComposeAnimation.apiAvailable)
-            setOf(InfiniteTransitionSearch(isAnimationPreview) {
+            setOf(InfiniteTransitionSearch() {
                 clock().trackInfiniteTransition(it)
             })
         else emptySet()
@@ -123,20 +122,23 @@
     private val setToSearch = setToTrack + setOf(animatedContentSearch)
 
     /**
-     * If non of supported animations are detected, unsupported animations should not be
-     * available either.
-     *
-     * TODO(b/303254098): We only need to search all animations when we're in Animation Preview.
-     *                    Otherwise, stopping after finding the first one should be enough.
+     * Finds if any of supported animations are available. It DOES NOT map detected animations to
+     * corresponding animation types.
      */
-    val hasAnimations: Boolean
-        get() = supportedSearch.any { it.hasAnimations() }
+
+    fun searchAny(slotTrees: Collection<Group>): Boolean {
+        return slotTrees.any { tree ->
+            val groups = tree.findAll { true }
+            supportedSearch.any { search -> search.hasAnimations(groups) }
+        }
+    }
 
     /**
-     * Finds all animations defined in the Compose tree where the root is the
-     * `@Composable` being previewed.
+     * Finds all animations defined in the Compose tree where the root is the `@Composable` being
+     * previewed. Each found animation is mapped to corresponding animation type and tracked.
+     * It should NOT be called if no animation is found with [searchAny].
      */
-    fun findAll(slotTrees: Collection<Group>) {
+    fun attachAllAnimations(slotTrees: Collection<Group>) {
         // Check all the slot tables, since some animations might not be present in the same
         // table as the one containing the `@Composable` being previewed, e.g. when they're
         // defined using sub-composition.
@@ -151,20 +153,28 @@
             // ignore these animations while support is not added to Animation Preview.
             transitionSearch.animations.removeAll(animatedContentSearch.animations)
         }
-    }
-
-    /** Make the [clock] track all the animations found. */
-    fun trackAll() {
-        if (hasAnimations) {
-            setToTrack.forEach { it.track() }
-        }
+        // Make the clock track all the animations found.
+        setToTrack.forEach { it.track() }
     }
 
     /** Search for animations with type [T]. */
-    open class Search<T : Any>(private val trackAnimation: (T) -> Unit) {
+    abstract class Search<T : Any>(private val trackAnimation: (T) -> Unit) {
+
+        fun hasAnimations(groups: Collection<Group>): Boolean {
+            return groups.any { hasAnimation(it) }
+        }
+
+        abstract fun hasAnimation(group: Group): Boolean
+
         val animations = mutableSetOf<T>()
+
+        /**
+         *  Add all found animations to [animations] list. Should only be called in Animation
+         *  Preview, otherwise other tools (e.g. Interactive Preview) might not render animations
+         *  correctly.
+         */
         open fun addAnimations(groups: Collection<Group>) {}
-        fun hasAnimations() = animations.isNotEmpty()
+
         fun track() {
             // Animations are found in reversed order in the tree,
             // reverse it back so they are tracked in the order they appear in the code.
@@ -182,12 +192,16 @@
             animations.addAll(groupsWithLocation.findRememberCallWithType(clazz).toSet())
         }
 
-        private fun <T : Any> Collection<Group>.findRememberCallWithType(clazz: KClass<T>):
-            List<T> {
-            return mapNotNull {
-                clazz.safeCast(
-                    it.data.firstOrNull { data -> data?.javaClass?.kotlin == clazz })
-            }
+        override fun hasAnimation(group: Group): Boolean {
+            return group.location != null && group.findRememberCallWithType(clazz) != null
+        }
+
+        private fun <T : Any> Collection<Group>.findRememberCallWithType(clazz: KClass<T>) =
+            mapNotNull { it.findRememberCallWithType(clazz) }
+
+        private fun <T : Any> Group.findRememberCallWithType(clazz: KClass<T>): T? {
+            return clazz.safeCast(
+                this.data.firstOrNull { data -> data?.javaClass?.kotlin == clazz })
         }
     }
 
@@ -203,26 +217,34 @@
     )
 
     class InfiniteTransitionSearch(
-        private val isAnimationPreview: Boolean,
         trackAnimation: (InfiniteTransitionSearchInfo) -> Unit
     ) : Search<InfiniteTransitionSearchInfo>(trackAnimation) {
 
-        override fun addAnimations(groups: Collection<Group>) {
-            val groupsWithLocation = groups.filter { it.location != null }
-            animations.addAll(findAnimations(groupsWithLocation))
+        override fun hasAnimation(group: Group): Boolean {
+            return toAnimationGroup(group)?.let {
+                group.findData<InfiniteTransition>() != null &&
+                    findToolingOverride(group) != null
+            } ?: false
         }
 
-        private fun findAnimations(groupsWithLocation: Collection<Group>):
-            List<InfiniteTransitionSearchInfo> {
-            val groups =
-                groupsWithLocation.filter { group -> group.name == REMEMBER_INFINITE_TRANSITION }
-                    .filterIsInstance<CallGroup>()
+        override fun addAnimations(groups: Collection<Group>) {
+            animations.addAll(findAnimations(groups))
+        }
 
-            return groups.mapNotNull {
+        private fun toAnimationGroup(group: Group): CallGroup? {
+            return group.takeIf {
+                group.location != null && group.name == REMEMBER_INFINITE_TRANSITION
+            }?.let { it as? CallGroup }
+        }
+
+        private fun findAnimations(groups: Collection<Group>):
+            List<InfiniteTransitionSearchInfo> {
+
+            return groups.mapNotNull { toAnimationGroup(it) }.mapNotNull {
                 val infiniteTransition = it.findData<InfiniteTransition>()
-                val toolingOverride = it.findData<MutableState<State<Long>?>>(true)
+                val toolingOverride = findToolingOverride(it)
                 if (infiniteTransition != null && toolingOverride != null) {
-                    if (toolingOverride.value == null && isAnimationPreview) {
+                    if (toolingOverride.value == null) {
                         toolingOverride.value = ToolingState(0L)
                     }
                     InfiniteTransitionSearchInfo(
@@ -232,6 +254,15 @@
                 } else null
             }
         }
+
+        /**
+         * InfiniteTransition declares a mutableStateOf<State<Long>?>, starting as null, that we can
+         * use to override the animatable value in Animation Preview. We do that by getting the
+         * [MutableState] from the slot table and directly setting its value. InfiniteTransition
+         * will use the tooling override if this value is not null.
+         */
+        private fun findToolingOverride(group: Group) =
+            group.findData<MutableState<State<Long>?>>(true)
     }
 
     data class AnimateXAsStateSearchInfo<T, V : AnimationVector>(
@@ -242,15 +273,31 @@
 
     /** Search for animateXAsState() and animateValueAsState() animations. */
     class AnimateXAsStateSearch(
-        private val isAnimationPreview: Boolean,
         trackAnimation: (AnimateXAsStateSearchInfo<*, *>) -> Unit
     ) : Search<AnimateXAsStateSearchInfo<*, *>>(trackAnimation) {
-        override fun addAnimations(groups: Collection<Group>) {
-            val groupsWithLocation = groups.filter { it.location != null }
-            animations.addAll(findAnimations<Any?>(groupsWithLocation))
+
+        override fun hasAnimation(group: Group): Boolean {
+            return toAnimationGroup(group)?.let {
+                findAnimatable<Any?>(it) != null &&
+                    findAnimationSpec<Any?>(it) != null &&
+                    findToolingOverride<Any?>(it) != null
+            } ?: false
         }
 
-        private fun <T> findAnimations(groupsWithLocation: Collection<Group>):
+        override fun addAnimations(groups: Collection<Group>) {
+            animations.addAll(findAnimations<Any?>(groups))
+        }
+
+        /**
+         * Find the [Group] containing animation.
+         */
+        private fun toAnimationGroup(group: Group): CallGroup? {
+            return group.takeIf {
+                it.location != null && it.name == ANIMATE_VALUE_AS_STATE
+            }?.let { it as? CallGroup }
+        }
+
+        private fun <T> findAnimations(groups: Collection<Group>):
             List<AnimateXAsStateSearchInfo<T, AnimationVector>> {
             // How "animateXAsState" calls organized:
             // Group with name "animateXAsState", for example animateDpAsState, animateIntAsState
@@ -262,22 +309,12 @@
             // To distinguish Animatable within "animateXAsState" calls from other Animatables,
             // first "animateValueAsState" calls are found.
             //  Find Animatable within "animateValueAsState" call.
-            val groups = groupsWithLocation.filter { group -> group.name == ANIMATE_VALUE_AS_STATE }
-                .filterIsInstance<CallGroup>()
-            return groups.mapNotNull {
+            return groups.mapNotNull { toAnimationGroup(it) }.mapNotNull {
                 val animatable = findAnimatable<T>(it)
                 val spec = findAnimationSpec<T>(it)
-                // animateValueAsState declares a mutableStateOf<State<T>?>, starting as null, that
-                // we can use to override the animatable value in Animation Preview. We do that by
-                // getting the MutableState from the slot table and directly setting its value.
-                // animateValueAsState will use the tooling override if this value is not null.
-                // For that reason, it's important that we only override if we're in Animation
-                // Preview, otherwise other tools (e.g. Interactive Preview) might not render
-                // animations correctly.
-                val toolingOverride =
-                    it.children.findRememberedData<MutableState<State<T>?>>().firstOrNull()
+                val toolingOverride = findToolingOverride<T>(it)
                 if (animatable != null && spec != null && toolingOverride != null) {
-                    if (toolingOverride.value == null && isAnimationPreview) {
+                    if (toolingOverride.value == null) {
                         toolingOverride.value = ToolingState(animatable.value)
                     }
                     AnimateXAsStateSearchInfo(
@@ -290,6 +327,16 @@
             }
         }
 
+        /**
+         * animateValueAsState declares a mutableStateOf<State<T>?>, starting as null, that we can
+         * use to override the animatable value in Animation Preview. We do that by getting the
+         * [MutableState] from the slot table and directly setting its value. animateValueAsState
+         * will use the tooling override if this value is not null.
+         */
+        private fun <T>findToolingOverride(group: Group): MutableState<State<T>?>? {
+            return group.children.findRememberedData<MutableState<State<T>?>>().firstOrNull()
+        }
+
         @Suppress("UNCHECKED_CAST")
         private fun <T> findAnimationSpec(group: CallGroup): AnimationSpec<T>? {
             val rememberStates = group.children.filter { it.name == REMEMBER_UPDATED_STATE }
@@ -308,6 +355,15 @@
     /** Search for animateContentSize() animations. */
     class AnimateContentSizeSearch(trackAnimation: (Any) -> Unit) :
         Search<Any>(trackAnimation) {
+
+        override fun hasAnimation(group: Group): Boolean {
+            return group.modifierInfo.isNotEmpty() && group.modifierInfo.any {
+                it.modifier.any { mod ->
+                    mod.javaClass.name == SIZE_ANIMATION_MODIFIER
+                }
+            }
+        }
+
         // It's important not to pre-filter the groups by location, as there's no guarantee
         // that the group containing the modifierInfo we are looking for has a non-null location.
         override fun addAnimations(groups: Collection<Group>) {
@@ -330,42 +386,71 @@
     /** Search for updateTransition() animations. */
     class TransitionSearch(trackAnimation: (Transition<*>) -> Unit) :
         Search<Transition<*>>(trackAnimation) {
+
+        override fun hasAnimation(group: Group): Boolean {
+            return toAnimationGroup(group) != null
+        }
+
         override fun addAnimations(groups: Collection<Group>) {
+            animations.addAll(groups.mapNotNull { toAnimationGroup(it) }.findRememberedData())
+        }
+
+        /**
+         * Find the [Group] containing animation.
+         */
+        private fun toAnimationGroup(group: Group): Group? {
             // Find `updateTransition` calls.
-            val groupsWithLocation = groups.filter { it.location != null }
-            animations.addAll(groupsWithLocation.filter {
-                it.name == UPDATE_TRANSITION
-            }.findRememberedData())
+            return group.takeIf { it.location != null && it.name == UPDATE_TRANSITION }
         }
     }
 
     /** Search for AnimatedVisibility animations. */
     class AnimatedVisibilitySearch(trackAnimation: (Transition<*>) -> Unit) :
         Search<Transition<*>>(trackAnimation) {
+
+        override fun hasAnimation(group: Group): Boolean {
+            return toAnimationGroup(group) != null
+        }
+
         override fun addAnimations(groups: Collection<Group>) {
-            // Find `AnimatedVisibility` calls.
-            // Then, find the underlying `updateTransition` it uses.
-            val groupsWithLocation = groups.filter { it.location != null }
-            animations.addAll(groupsWithLocation.filter { it.name == ANIMATED_VISIBILITY }
-                .mapNotNull {
-                    it.children.firstOrNull { updateTransitionCall ->
-                        updateTransitionCall.name == UPDATE_TRANSITION
-                    }
-                }.findRememberedData())
+            animations.addAll(groups.mapNotNull { toAnimationGroup(it) }.findRememberedData())
+        }
+
+        /**
+         * Find the [Group] containing animation.
+         */
+        private fun toAnimationGroup(group: Group): Group? {
+            // Find `AnimatedVisibility` call.
+            return group.takeIf { it.location != null && it.name == ANIMATED_VISIBILITY }?.let {
+                // Then, find the underlying `updateTransition` it uses.
+                it.children.firstOrNull { updateTransitionCall ->
+                    updateTransitionCall.name == UPDATE_TRANSITION
+                }
+            }
         }
     }
 
     /** Search for AnimatedContent animations. */
     class AnimatedContentSearch(trackAnimation: (Transition<*>) -> Unit) :
         Search<Transition<*>>(trackAnimation) {
+
+        override fun hasAnimation(group: Group): Boolean {
+            return toAnimationGroup(group) != null
+        }
+
         override fun addAnimations(groups: Collection<Group>) {
-            val groupsWithLocation = groups.filter { it.location != null }
-            animations.addAll(groupsWithLocation.filter { it.name == ANIMATED_CONTENT }
-                .mapNotNull {
-                    it.children.firstOrNull { updateTransitionCall ->
-                        updateTransitionCall.name == UPDATE_TRANSITION
-                    }
-                }.findRememberedData())
+            animations.addAll(groups.mapNotNull { toAnimationGroup(it) }.findRememberedData())
+        }
+
+        /**
+         * Find the [Group] containing animation.
+         */
+        private fun toAnimationGroup(group: Group): Group? {
+            return group.takeIf { group.location != null && group.name == ANIMATED_CONTENT }?.let {
+                it.children.firstOrNull { updateTransitionCall ->
+                    updateTransitionCall.name == UPDATE_TRANSITION
+                }
+            }
         }
     }
 }
diff --git a/compose/ui/ui-unit/api/current.txt b/compose/ui/ui-unit/api/current.txt
index 74aa8d8..eba7f2c 100644
--- a/compose/ui/ui-unit/api/current.txt
+++ b/compose/ui/ui-unit/api/current.txt
@@ -46,7 +46,7 @@
     method @androidx.compose.runtime.Stable public static long offset(long, optional int horizontal, optional int vertical);
   }
 
-  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface Density extends androidx.compose.ui.unit.FontScalable {
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface Density extends androidx.compose.ui.unit.FontScaling {
     method public float getDensity();
     method @androidx.compose.runtime.Stable public default int roundToPx(float);
     method @androidx.compose.runtime.Stable public default int roundToPx(long);
@@ -192,14 +192,14 @@
   @SuppressCompatibility @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalUnitApi {
   }
 
-  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface FontScalable {
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface FontScaling {
     method public float getFontScale();
     method @androidx.compose.runtime.Stable public default float toDp(long);
     method @androidx.compose.runtime.Stable public default long toSp(float);
     property public abstract float fontScale;
   }
 
-  public final class FontScalableKt {
+  public final class FontScalingKt {
     method @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public static boolean getDisableNonLinearFontScalingInCompose();
     method @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public static void setDisableNonLinearFontScalingInCompose(boolean);
     property @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public static final boolean DisableNonLinearFontScalingInCompose;
diff --git a/compose/ui/ui-unit/api/restricted_current.txt b/compose/ui/ui-unit/api/restricted_current.txt
index e9ca1c6..e9b932e 100644
--- a/compose/ui/ui-unit/api/restricted_current.txt
+++ b/compose/ui/ui-unit/api/restricted_current.txt
@@ -46,7 +46,7 @@
     method @androidx.compose.runtime.Stable public static long offset(long, optional int horizontal, optional int vertical);
   }
 
-  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface Density extends androidx.compose.ui.unit.FontScalable {
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface Density extends androidx.compose.ui.unit.FontScaling {
     method public float getDensity();
     method @androidx.compose.runtime.Stable public default int roundToPx(float);
     method @androidx.compose.runtime.Stable public default int roundToPx(long);
@@ -192,14 +192,14 @@
   @SuppressCompatibility @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalUnitApi {
   }
 
-  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface FontScalable {
+  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmDefaultWithCompatibility public interface FontScaling {
     method public float getFontScale();
     method @androidx.compose.runtime.Stable public default float toDp(long);
     method @androidx.compose.runtime.Stable public default long toSp(float);
     property public abstract float fontScale;
   }
 
-  public final class FontScalableKt {
+  public final class FontScalingKt {
     method @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public static boolean getDisableNonLinearFontScalingInCompose();
     method @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public static void setDisableNonLinearFontScalingInCompose(boolean);
     property @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public static final boolean DisableNonLinearFontScalingInCompose;
diff --git a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScalable.android.kt b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScalable.android.kt
deleted file mode 100644
index b1b4075..0000000
--- a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScalable.android.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.unit
-
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.unit.fontscaling.FontScaleConverterFactory
-import androidx.compose.ui.unit.internal.JvmDefaultWithCompatibility
-
-/**
- * Converts [TextUnit] to [Dp] and vice-versa.
- *
- * Note that the converter can't be cached in the interface itself. FontScaleConverterFactory
- * already caches the tables, but it still does a a map lookup for each conversion. If you are
- * implementing this interface, you should cache your own converter for additional speed.
- */
-@Immutable
-@JvmDefaultWithCompatibility
-@OptIn(ExperimentalComposeUiApi::class)
-actual interface FontScalable {
-    /**
-     * Current user preference for the scaling factor for fonts.
-     */
-    @Stable
-    actual val fontScale: Float
-
-    /**
-     * Convert [Dp] to Sp. Sp is used for font size, etc.
-     */
-    @Stable
-    actual fun Dp.toSp(): TextUnit {
-        if (!FontScaleConverterFactory.isNonLinearFontScalingActive(fontScale) ||
-            DisableNonLinearFontScalingInCompose) {
-            return (value / fontScale).sp
-        }
-
-        val converter = FontScaleConverterFactory.forScale(fontScale)
-        return (converter?.convertDpToSp(value) ?: (value / fontScale)).sp
-    }
-
-    /**
-     * Convert Sp to [Dp].
-     * @throws IllegalStateException if TextUnit other than SP unit is specified.
-     */
-    @Stable
-    actual fun TextUnit.toDp(): Dp {
-        check(type == TextUnitType.Sp) { "Only Sp can convert to Px" }
-        if (!FontScaleConverterFactory.isNonLinearFontScalingActive(fontScale) ||
-            DisableNonLinearFontScalingInCompose) {
-            return Dp(value * fontScale)
-        }
-
-        val converter = FontScaleConverterFactory.forScale(fontScale)
-        return if (converter == null) Dp(value * fontScale) else Dp(converter.convertSpToDp(value))
-    }
-}
diff --git a/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScaling.android.kt b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScaling.android.kt
new file mode 100644
index 0000000..e9f3565
--- /dev/null
+++ b/compose/ui/ui-unit/src/androidMain/kotlin/androidx/compose/ui/unit/FontScaling.android.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.unit
+
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.Stable
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.unit.fontscaling.FontScaleConverterFactory
+import androidx.compose.ui.unit.internal.JvmDefaultWithCompatibility
+
+/**
+ * Converts [TextUnit] to [Dp] and vice-versa.
+ *
+ * Note that the converter can't be cached in the interface itself. FontScaleConverterFactory
+ * already caches the tables, but it still does a a map lookup for each conversion. If you are
+ * implementing this interface, you should cache your own converter for additional speed.
+ */
+@Immutable
+@JvmDefaultWithCompatibility
+@OptIn(ExperimentalComposeUiApi::class)
+actual interface FontScaling {
+    /**
+     * Current user preference for the scaling factor for fonts.
+     */
+    @Stable
+    actual val fontScale: Float
+
+    /**
+     * Convert [Dp] to Sp. Sp is used for font size, etc.
+     */
+    @Stable
+    actual fun Dp.toSp(): TextUnit {
+        if (!FontScaleConverterFactory.isNonLinearFontScalingActive(fontScale) ||
+            DisableNonLinearFontScalingInCompose) {
+            return (value / fontScale).sp
+        }
+
+        val converter = FontScaleConverterFactory.forScale(fontScale)
+        return (converter?.convertDpToSp(value) ?: (value / fontScale)).sp
+    }
+
+    /**
+     * Convert Sp to [Dp].
+     * @throws IllegalStateException if TextUnit other than SP unit is specified.
+     */
+    @Stable
+    actual fun TextUnit.toDp(): Dp {
+        check(type == TextUnitType.Sp) { "Only Sp can convert to Px" }
+        if (!FontScaleConverterFactory.isNonLinearFontScalingActive(fontScale) ||
+            DisableNonLinearFontScalingInCompose) {
+            return Dp(value * fontScale)
+        }
+
+        val converter = FontScaleConverterFactory.forScale(fontScale)
+        return if (converter == null) Dp(value * fontScale) else Dp(converter.convertSpToDp(value))
+    }
+}
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
index 5b867be..59cd655 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Density.kt
@@ -46,7 +46,7 @@
  */
 @Immutable
 @JvmDefaultWithCompatibility
-interface Density : FontScalable {
+interface Density : FontScaling {
 
     /**
      * The logical density of the display. This is a scaling factor for the [Dp] unit.
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScalable.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScalable.kt
deleted file mode 100644
index 0c90726..0000000
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScalable.kt
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.unit
-
-import androidx.annotation.RestrictTo
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.unit.internal.JvmDefaultWithCompatibility
-
-/**
- * Flag indicating if [Density] will use non-linear font scaling for Compose.
- *
- * Set this flag to true to keep the old linear font scaling behavior. Note that this only affects
- * Compose. Views always use non-linear font scaling in Android 14 and later.
- *
- * <b>This flag will be removed in Compose 1.6.0-beta01.</b> If you encounter any issues with the
- * new behavior, please file an issue at: issuetracker.google.com/issues/new?component=779818
- */
-// TODO(b/300538470): Remove flag before beta
-@Suppress("GetterSetterNames", "OPT_IN_MARKER_ON_WRONG_TARGET")
-@get:Suppress("GetterSetterNames")
-@set:ExperimentalComposeUiApi
-@get:ExperimentalComposeUiApi
-@ExperimentalComposeUiApi
-var DisableNonLinearFontScalingInCompose by mutableStateOf(false)
-
-/**
- * Converts [TextUnit] to [Dp] and vice-versa.
- *
- * If you are implementing this interface yourself on Android, please check the docs for important
- * optimization tips about caching.
- */
-@Immutable
-@JvmDefaultWithCompatibility
-expect interface FontScalable {
-    /**
-     * Current user preference for the scaling factor for fonts.
-     */
-    @Stable
-    val fontScale: Float
-
-    /**
-     * Convert [Dp] to Sp. Sp is used for font size, etc.
-     */
-    @Stable
-    open fun Dp.toSp(): TextUnit
-
-    /**
-     * Convert Sp to [Dp].
-     * @throws IllegalStateException if TextUnit other than SP unit is specified.
-     */
-    @Stable
-    open fun TextUnit.toDp(): Dp
-}
-
-/**
- * Converts [TextUnit] to [Dp] and vice-versa, using a linear conversion.
- *
- * This will be the default for most platforms except Android.
- */
-@Immutable
-@JvmDefaultWithCompatibility
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-interface FontScalableLinear {
-    /**
-     * Current user preference for the scaling factor for fonts.
-     */
-    @Stable
-    val fontScale: Float
-
-    /**
-     * Convert [Dp] to Sp. Sp is used for font size, etc.
-     */
-    @Stable
-    fun Dp.toSp(): TextUnit = (value / fontScale).sp
-
-    /**
-     * Convert Sp to [Dp].
-     * @throws IllegalStateException if TextUnit other than SP unit is specified.
-     */
-    @Stable
-    fun TextUnit.toDp(): Dp {
-        check(type == TextUnitType.Sp) { "Only Sp can convert to Px" }
-        return Dp(value * fontScale)
-    }
-}
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScaling.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScaling.kt
new file mode 100644
index 0000000..65d23a8
--- /dev/null
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/FontScaling.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.unit
+
+import androidx.annotation.RestrictTo
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.unit.internal.JvmDefaultWithCompatibility
+
+/**
+ * Flag indicating if [Density] will use non-linear font scaling for Compose.
+ *
+ * Set this flag to true to keep the old linear font scaling behavior. Note that this only affects
+ * Compose. Views always use non-linear font scaling in Android 14 and later.
+ *
+ * <b>This flag will be removed in Compose 1.6.0-beta01.</b> If you encounter any issues with the
+ * new behavior, please file an issue at: issuetracker.google.com/issues/new?component=779818
+ */
+// TODO(b/300538470): Remove flag before beta
+@Suppress("GetterSetterNames", "OPT_IN_MARKER_ON_WRONG_TARGET")
+@get:Suppress("GetterSetterNames")
+@set:ExperimentalComposeUiApi
+@get:ExperimentalComposeUiApi
+@ExperimentalComposeUiApi
+var DisableNonLinearFontScalingInCompose by mutableStateOf(false)
+
+/**
+ * Converts [TextUnit] to [Dp] and vice-versa.
+ *
+ * If you are implementing this interface yourself on Android, please check the docs for important
+ * optimization tips about caching.
+ */
+@Immutable
+@JvmDefaultWithCompatibility
+expect interface FontScaling {
+    /**
+     * Current user preference for the scaling factor for fonts.
+     */
+    @Stable
+    val fontScale: Float
+
+    /**
+     * Convert [Dp] to Sp. Sp is used for font size, etc.
+     */
+    @Stable
+    open fun Dp.toSp(): TextUnit
+
+    /**
+     * Convert Sp to [Dp].
+     * @throws IllegalStateException if TextUnit other than SP unit is specified.
+     */
+    @Stable
+    open fun TextUnit.toDp(): Dp
+}
+
+/**
+ * Converts [TextUnit] to [Dp] and vice-versa, using a linear conversion.
+ *
+ * This will be the default for most platforms except Android.
+ */
+@Immutable
+@JvmDefaultWithCompatibility
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+interface FontScalingLinear {
+    /**
+     * Current user preference for the scaling factor for fonts.
+     */
+    @Stable
+    val fontScale: Float
+
+    /**
+     * Convert [Dp] to Sp. Sp is used for font size, etc.
+     */
+    @Stable
+    fun Dp.toSp(): TextUnit = (value / fontScale).sp
+
+    /**
+     * Convert Sp to [Dp].
+     * @throws IllegalStateException if TextUnit other than SP unit is specified.
+     */
+    @Stable
+    fun TextUnit.toDp(): Dp {
+        check(type == TextUnitType.Sp) { "Only Sp can convert to Px" }
+        return Dp(value * fontScale)
+    }
+}
diff --git a/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScalable.desktop.kt b/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScalable.desktop.kt
deleted file mode 100644
index d753871..0000000
--- a/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScalable.desktop.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.unit
-
-/**
- * Converts [TextUnit] to [Dp] and vice-versa.
- */
-actual typealias FontScalable = FontScalableLinear
diff --git a/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScaling.desktop.kt b/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScaling.desktop.kt
new file mode 100644
index 0000000..609aa4c
--- /dev/null
+++ b/compose/ui/ui-unit/src/desktopMain/kotlin/androidx/compose/ui/unit/FontScaling.desktop.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.unit
+
+/**
+ * Converts [TextUnit] to [Dp] and vice-versa.
+ */
+actual typealias FontScaling = FontScalingLinear
diff --git a/compose/ui/ui/api/api_lint.ignore b/compose/ui/ui/api/api_lint.ignore
index b334166..4148e4a 100644
--- a/compose/ui/ui/api/api_lint.ignore
+++ b/compose/ui/ui/api/api_lint.ignore
@@ -23,8 +23,6 @@
     Invalid name for boolean property `usePlatformDefaultWidth`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field ImageVector.autoMirror:
     Invalid name for boolean property `autoMirror`. Should start with one of `has`, `can`, `should`, `is`.
-GetterSetterNames: field ModifierNodeElement.autoInvalidate:
-    Invalid name for boolean property `autoInvalidate`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field PointerInputChange.pressed:
     Invalid name for boolean property `pressed`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field PointerInputChange.previousPressed:
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index c3e8a56..e93d846 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -427,20 +427,16 @@
     method public int getDown();
     method @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public int getEnter();
     method @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public int getExit();
-    method @Deprecated @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public int getIn();
     method public int getLeft();
     method public int getNext();
-    method @Deprecated @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public int getOut();
     method public int getPrevious();
     method public int getRight();
     method public int getUp();
     property public final int Down;
     property @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public final int Enter;
     property @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public final int Exit;
-    property @Deprecated @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public final int In;
     property public final int Left;
     property public final int Next;
-    property @Deprecated @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public final int Out;
     property public final int Previous;
     property public final int Right;
     property public final int Up;
@@ -2894,16 +2890,20 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
   }
 
+  public fun interface PlatformTextInputMethodRequest {
+    method public android.view.inputmethod.InputConnection createInputConnection(android.view.inputmethod.EditorInfo outAttributes);
+  }
+
   public interface PlatformTextInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
   }
 
   public final class PlatformTextInputModifierNodeKt {
-    method public static suspend Object? textInputSession(androidx.compose.ui.platform.PlatformTextInputModifierNode, kotlin.jvm.functions.Function2<? super androidx.compose.ui.platform.PlatformTextInputSessionScope,? super kotlin.coroutines.Continuation<?>,?> session, kotlin.coroutines.Continuation<?>);
+    method public static suspend Object? runTextInputSession(androidx.compose.ui.platform.PlatformTextInputModifierNode, kotlin.jvm.functions.Function2<? super androidx.compose.ui.platform.PlatformTextInputSessionScope,? super kotlin.coroutines.Continuation<?>,?> block, kotlin.coroutines.Continuation<?>);
   }
 
   public interface PlatformTextInputSession {
     method public android.view.View getView();
-    method public suspend Object? startInputMethod(androidx.compose.ui.text.input.PlatformTextInputMethodRequest request, kotlin.coroutines.Continuation<?>);
+    method public suspend Object? startInputMethod(androidx.compose.ui.platform.PlatformTextInputMethodRequest request, kotlin.coroutines.Continuation<?>);
     property public abstract android.view.View view;
   }
 
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index ba7fb5d..f056cf7 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -427,20 +427,16 @@
     method public int getDown();
     method @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public int getEnter();
     method @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public int getExit();
-    method @Deprecated @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public int getIn();
     method public int getLeft();
     method public int getNext();
-    method @Deprecated @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public int getOut();
     method public int getPrevious();
     method public int getRight();
     method public int getUp();
     property public final int Down;
     property @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public final int Enter;
     property @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public final int Exit;
-    property @Deprecated @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public final int In;
     property public final int Left;
     property public final int Next;
-    property @Deprecated @SuppressCompatibility @androidx.compose.ui.ExperimentalComposeUiApi public final int Out;
     property public final int Previous;
     property public final int Right;
     property public final int Up;
@@ -2948,16 +2944,20 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.input.nestedscroll.NestedScrollConnection rememberNestedScrollInteropConnection(optional android.view.View hostView);
   }
 
+  public fun interface PlatformTextInputMethodRequest {
+    method public android.view.inputmethod.InputConnection createInputConnection(android.view.inputmethod.EditorInfo outAttributes);
+  }
+
   public interface PlatformTextInputModifierNode extends androidx.compose.ui.node.DelegatableNode {
   }
 
   public final class PlatformTextInputModifierNodeKt {
-    method public static suspend Object? textInputSession(androidx.compose.ui.platform.PlatformTextInputModifierNode, kotlin.jvm.functions.Function2<? super androidx.compose.ui.platform.PlatformTextInputSessionScope,? super kotlin.coroutines.Continuation<?>,?> session, kotlin.coroutines.Continuation<?>);
+    method public static suspend Object? runTextInputSession(androidx.compose.ui.platform.PlatformTextInputModifierNode, kotlin.jvm.functions.Function2<? super androidx.compose.ui.platform.PlatformTextInputSessionScope,? super kotlin.coroutines.Continuation<?>,?> block, kotlin.coroutines.Continuation<?>);
   }
 
   public interface PlatformTextInputSession {
     method public android.view.View getView();
-    method public suspend Object? startInputMethod(androidx.compose.ui.text.input.PlatformTextInputMethodRequest request, kotlin.coroutines.Continuation<?>);
+    method public suspend Object? startInputMethod(androidx.compose.ui.platform.PlatformTextInputMethodRequest request, kotlin.coroutines.Continuation<?>);
     property public abstract android.view.View view;
   }
 
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/graphics/vector/CreateVectorPainterBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/graphics/vector/CreateVectorPainterBenchmark.kt
index 00182f8..e96dac5 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/graphics/vector/CreateVectorPainterBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/graphics/vector/CreateVectorPainterBenchmark.kt
@@ -52,13 +52,6 @@
             RecreateVectorPainterTestCase()
         }, assertOneRecomposition = false)
     }
-
-    @Test
-    fun renderVectorWithDifferentSizes() {
-        benchmarkRule.toggleStateBenchmarkDraw({
-            ResizeVectorPainter()
-        }, assertOneRecomposition = false)
-    }
 }
 
 private class RecreateVectorPainterTestCase : ComposeTestCase, ToggleableTestCase {
@@ -87,39 +80,3 @@
         }
     }
 }
-
-private class ResizeVectorPainter : ComposeTestCase, ToggleableTestCase {
-
-    private var alpha by mutableStateOf(1f)
-
-    @Composable
-    override fun Content() {
-        Column {
-            Box(modifier = Modifier.wrapContentSize()) {
-                Image(
-                    painter = painterResource(R.drawable.ic_hourglass),
-                    contentDescription = null,
-                    modifier = Modifier.size(100.dp),
-                    alpha = alpha
-                )
-            }
-
-            Box(modifier = Modifier.wrapContentSize()) {
-                Image(
-                    painter = painterResource(R.drawable.ic_hourglass),
-                    contentDescription = null,
-                    modifier = Modifier.size(200.dp),
-                    alpha = alpha
-                )
-            }
-        }
-    }
-
-    override fun toggleState() {
-        if (alpha == 1.0f) {
-            alpha = 0.5f
-        } else {
-            alpha = 1.0f
-        }
-    }
-}
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
index 91b5ebb..b86df32c 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
@@ -238,12 +238,13 @@
 val AccessibilityDemos = DemoCategory(
     "Accessibility",
     listOf(
-        ComposableDemo("Scaffold Top Bar") { ScaffoldSample() },
-        ComposableDemo("Scaffold with Scrolling") { ScaffoldSampleScroll() },
+        ComposableDemo("Scaffold Top Bar") { ScaffoldSampleDemo() },
+        ComposableDemo("Scaffold with Scrolling") { ScaffoldSampleScrollDemo() },
         ComposableDemo("Simple Top Bar with Scrolling") { ScrollingColumnDemo() },
         ComposableDemo("Nested Containers—True") { NestedContainersTrueDemo() },
         ComposableDemo("Nested Containers—False") { NestedContainersFalseDemo() },
-        ComposableDemo("Linear Progress Indicator") { LinearProgressIndicatorDemo() }
+        ComposableDemo("Linear Progress Indicator") { LinearProgressIndicatorDemo() },
+        ComposableDemo("Dual LTR and RTL Scene") { SimpleRtlLayoutDemo() }
     )
 )
 
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibility.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibility.kt
deleted file mode 100644
index f2096fe..0000000
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibility.kt
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.demos
-
-import android.widget.TextView
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.material.BottomAppBar
-import androidx.compose.material.Button
-import androidx.compose.material.DrawerValue
-import androidx.compose.material.FabPosition
-import androidx.compose.material.FloatingActionButton
-import androidx.compose.material.Icon
-import androidx.compose.material.IconButton
-import androidx.compose.material.LinearProgressIndicator
-import androidx.compose.material.MaterialTheme
-import androidx.compose.material.Scaffold
-import androidx.compose.material.Text
-import androidx.compose.material.TopAppBar
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Add
-import androidx.compose.material.icons.filled.Face
-import androidx.compose.material.rememberDrawerState
-import androidx.compose.material.rememberScaffoldState
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.demos.databinding.TestLayoutBinding
-import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.semantics.clearAndSetSemantics
-import androidx.compose.ui.semantics.isTraversalGroup
-import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.semantics.traversalIndex
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.viewinterop.AndroidView
-import androidx.compose.ui.viewinterop.AndroidViewBinding
-
-@Composable
-fun LastElementOverLaidColumn(
-    modifier: Modifier = Modifier,
-    content: @Composable () -> Unit,
-) {
-    var yPosition = 0
-
-    Layout(modifier = modifier, content = content) { measurables, constraints ->
-        val placeables = measurables.map { measurable ->
-            measurable.measure(constraints)
-        }
-
-        layout(constraints.maxWidth, constraints.maxHeight) {
-            placeables.forEach { placeable ->
-                if (placeable != placeables[placeables.lastIndex]) {
-                    placeable.placeRelative(x = 0, y = yPosition)
-                    yPosition += placeable.height
-                } else {
-                    // if the element is our last element (our overlaid node)
-                    // then we'll put it over the middle of our previous elements
-                    placeable.placeRelative(x = 0, y = yPosition / 2)
-                }
-            }
-        }
-    }
-}
-
-@Preview
-@Composable
-fun OverlaidNodeLayoutDemo() {
-    LastElementOverLaidColumn(modifier = Modifier.padding(8.dp)) {
-        Row {
-            Column(modifier = Modifier.testTag("Text1")) {
-                Row { Text("text1\n") }
-                Row { Text("text2\n") }
-                Row { Text("text3\n") }
-            }
-        }
-        Row {
-            Text("overlaid node")
-        }
-    }
-}
-
-@Composable
-fun CardRow(
-    modifier: Modifier,
-    columnNumber: Int,
-    topSampleText: String,
-    bottomSampleText: String
-) {
-    Row(
-        modifier,
-        verticalAlignment = Alignment.CenterVertically,
-        horizontalArrangement = Arrangement.End
-    ) {
-        Column {
-            Text(topSampleText + columnNumber)
-            Text(bottomSampleText + columnNumber)
-        }
-    }
-}
-
-@Preview
-@Composable
-fun NestedContainersFalseDemo() {
-    var topSampleText = "Top text in column "
-    var bottomSampleText = "Bottom text in column "
-    Column(
-        Modifier
-            .testTag("Test Tag")
-            .semantics { isTraversalGroup = true }
-    ) {
-        Row() { Modifier.semantics { isTraversalGroup = true }
-            CardRow(
-                Modifier.semantics { isTraversalGroup = false },
-                1,
-                topSampleText,
-                bottomSampleText)
-            CardRow(
-                Modifier.semantics { isTraversalGroup = false },
-                2,
-                topSampleText,
-                bottomSampleText)
-        }
-    }
-}
-
-@Preview
-@Composable
-fun NestedContainersTrueDemo() {
-    var topSampleText = "Top text in column "
-    var bottomSampleText = "Bottom text in column "
-    Column(
-        Modifier
-            .testTag("Test Tag")
-            .semantics { isTraversalGroup = true }
-    ) {
-        Row() { Modifier.semantics { isTraversalGroup = true }
-            CardRow(
-                Modifier.semantics { isTraversalGroup = true },
-                1,
-                topSampleText,
-                bottomSampleText)
-            CardRow(
-                Modifier.semantics { isTraversalGroup = true },
-                2,
-                topSampleText,
-                bottomSampleText)
-        }
-    }
-}
-
-@Composable
-fun TopAppBar() {
-    val topAppBar = "Top App Bar"
-    TopAppBar(
-        title = {
-            Text(text = topAppBar)
-        }
-    )
-}
-
-@Composable
-fun ScrollColumn(padding: PaddingValues) {
-    var counter = 0
-    var sampleText = "Sample text in column"
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(padding)
-            .testTag("Test Tag")
-    ) {
-        repeat(100) {
-            Text(sampleText + counter++)
-        }
-    }
-}
-
-@Preview
-@Composable
-fun ScaffoldSample() {
-    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
-    Scaffold(
-        scaffoldState = scaffoldState,
-        topBar = { TopAppBar() },
-        floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        } },
-        drawerContent = { Text(text = "Drawer Menu 1") },
-        content = { padding -> Text("Content", modifier = Modifier.padding(padding)) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
-    )
-}
-
-@Preview
-@Composable
-fun ScaffoldSampleScroll() {
-    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
-    Scaffold(
-        scaffoldState = scaffoldState,
-        topBar = { TopAppBar() },
-        floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        } },
-        content = { padding -> ScrollColumn(padding) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
-    )
-}
-
-@Preview
-@Composable
-fun ScrollingColumnDemo() {
-    var sampleText = "Sample text in column"
-    var counter = 0
-
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .testTag("Test Tag")
-    ) {
-        TopAppBar()
-        repeat(100) {
-            Text(sampleText + counter++)
-        }
-    }
-}
-
-@Preview
-@Composable
-fun OverlaidNodeTraversalIndexDemo() {
-    LastElementOverLaidColumn(
-        Modifier
-            .semantics { isTraversalGroup = true }
-            .padding(8.dp)) {
-        Row {
-            Column(modifier = Modifier.testTag("Text1")) {
-                Row { Text("text1\n") }
-                Row { Text("text2\n") }
-                Row { Text("text3\n") }
-            }
-        }
-        // Since default traversalIndex is 0, `traversalIndex = -1f` here means that the overlaid
-        // node is read first, even though visually it's below the other text.
-        // Container needs to be true, otherwise we only read/register significant
-        Row(Modifier.semantics { isTraversalGroup = true; traversalIndex = -1f }) {
-            Text("overlaid node")
-        }
-    }
-}
-
-@Composable
-fun FloatingBox() {
-    Box(modifier = Modifier.semantics { isTraversalGroup = true; traversalIndex = -1f }) {
-        FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        }
-    }
-}
-
-@Composable
-fun ContentColumn(padding: PaddingValues) {
-    var counter = 0
-    var sampleText = "Sample text in column"
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(padding)
-            .testTag("Test Tag")
-    ) {
-        // every other value has an explicitly set `traversalIndex`
-        Text(text = sampleText + counter++)
-        Text(text = sampleText + counter++,
-            modifier = Modifier.semantics { traversalIndex = 1f })
-        Text(text = sampleText + counter++)
-        Text(text = sampleText + counter++,
-            modifier = Modifier.semantics { traversalIndex = 1f })
-        Text(text = sampleText + counter++)
-        Text(text = sampleText + counter++,
-            modifier = Modifier.semantics { traversalIndex = 1f })
-        Text(text = sampleText + counter++)
-    }
-}
-
-/**
- * Example of how `traversalIndex` and traversal groups can be used to customize TalkBack
- * ordering. The example below puts the FAB into a box (with `isTraversalGroup = true` and a
- * custom traversal index) to have it appear first when TalkBack is turned on. The
- * text in the column also has been modified. See go/traversal-index-changes for more detail
- */
-@Preview
-@Composable
-fun NestedTraversalIndexInheritanceDemo() {
-    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
-    Scaffold(
-        scaffoldState = scaffoldState,
-        topBar = { TopAppBar() },
-        floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingBox() },
-        drawerContent = { Text(text = "Drawer Menu 1") },
-        content = { padding -> ContentColumn(padding = padding) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
-    )
-}
-
-@Preview
-@Composable
-fun NestedAndPeerTraversalIndexDemo() {
-    Column(
-        Modifier
-            // Having a traversal index here as 8f shouldn't affect anything; this column
-            // has no other peers that its compared to
-            .semantics { traversalIndex = 8f; isTraversalGroup = true }
-            .padding(8.dp)
-    ) {
-        Row(
-            Modifier.semantics { traversalIndex = 3f; isTraversalGroup = true }
-        ) {
-            Column(modifier = Modifier.testTag("Text1")) {
-                Row { Text("text 3\n") }
-                Row {
-                    Text(text = "text 5\n", modifier = Modifier.semantics { traversalIndex = 1f })
-                }
-                Row { Text("text 4\n") }
-            }
-        }
-        Row {
-            Text(text = "text 2\n", modifier = Modifier.semantics { traversalIndex = 2f })
-        }
-        Row {
-            Text(text = "text 1\n", modifier = Modifier.semantics { traversalIndex = 1f })
-        }
-        Row {
-            Text(text = "text 0\n")
-        }
-    }
-}
-
-@Preview
-@Composable
-fun IconsInScaffoldWithListDemo() {
-    Scaffold(
-        topBar = {
-            Row(
-                horizontalArrangement = Arrangement.SpaceEvenly
-            ) {
-                IconButton(onClick = { }) {
-                    Icon(Icons.Default.Face, contentDescription = "Face 1")
-                }
-                // Setting `clearAndSetSemantics` below means that Face 2 will not be sorted nor
-                // will be read by TalkBack. The final traversal order should go from Face 1 to
-                // Face 3 to the LazyColumn content.
-                IconButton(
-                    onClick = { },
-                    modifier = Modifier.clearAndSetSemantics { }
-                ) {
-                    Icon(Icons.Default.Face, contentDescription = "Face 2")
-                }
-                IconButton(onClick = { }) {
-                    Icon(Icons.Default.Face, contentDescription = "Face 3")
-                }
-            }
-        },
-        content = { innerPadding ->
-            LazyColumn(
-                contentPadding = innerPadding,
-                verticalArrangement = Arrangement.spacedBy(8.dp)
-            ) {
-                val list = (0..75).map { it.toString() }
-                items(count = list.size) {
-                    Text(
-                        text = list[it],
-                        modifier = Modifier
-                            .fillMaxWidth()
-                            .padding(horizontal = 16.dp)
-                    )
-                }
-            }
-        }
-    )
-}
-
-@Composable
-fun InteropColumn(padding: PaddingValues) {
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(padding)
-            .testTag("Test Tag")
-    ) {
-        Button(onClick = { }) {
-            Text("Button that comes before an AndroidViewBinding")
-        }
-
-        AndroidViewBinding(TestLayoutBinding::inflate) {
-            text1.text = "AndroidViewBinding text"
-        }
-
-        Button(onClick = { }) {
-            Text("Button that comes after an AndroidViewBinding and before another TextView")
-        }
-
-        AndroidView(::TextView) {
-            it.text = "This is a text in a TextView"
-        }
-
-        Button(onClick = { }) {
-            Text("Last text button")
-        }
-    }
-}
-
-@Preview
-@Composable
-fun InteropSample() {
-    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
-    Scaffold(
-        scaffoldState = scaffoldState,
-        topBar = { TopAppBar() },
-        floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        } },
-        drawerContent = { Text(text = "Drawer Menu 1") },
-        content = { padding -> InteropColumn(padding) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
-    )
-}
-
-@Composable
-fun InteropColumnBackwards(padding: PaddingValues) {
-    Column(
-        Modifier
-            .verticalScroll(rememberScrollState())
-            .padding(padding)
-            .testTag("Test Tag")
-    ) {
-        Button(
-            modifier = Modifier.semantics { traversalIndex = 4f },
-            onClick = { }
-        ) {
-            Text("Last button after AndroidViewBinding")
-        }
-
-        AndroidViewBinding(
-            TestLayoutBinding::inflate,
-            modifier = Modifier.semantics { traversalIndex = 3f }
-        ) {
-            text1.text = "Fourth — AndroidViewBinding"
-        }
-
-        Button(
-            modifier = Modifier.semantics { traversalIndex = 2f },
-            onClick = { }
-        ) {
-            Text("Third — Compose button")
-        }
-
-        AndroidView(
-            ::TextView,
-            modifier = Modifier.semantics { traversalIndex = 1f }
-        ) {
-            it.text = "Second is a text in a TextView"
-        }
-
-        Button(
-            modifier = Modifier.semantics { traversalIndex = 0f },
-            onClick = { }
-        ) {
-            Text("First button")
-        }
-    }
-}
-
-@Preview
-@Composable
-fun InteropSampleBackwards() {
-    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
-    Scaffold(
-        scaffoldState = scaffoldState,
-        topBar = { TopAppBar() },
-        floatingActionButtonPosition = FabPosition.End,
-        floatingActionButton = { FloatingActionButton(onClick = {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-        } },
-        drawerContent = { Text(text = "Drawer Menu 1") },
-        content = { padding -> InteropColumnBackwards(padding) },
-        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
-            Text("Bottom App Bar") } }
-    )
-}
-
-@Preview
-@Composable
-fun LinearProgressIndicatorDemo() {
-    Column(horizontalAlignment = Alignment.CenterHorizontally) {
-        Text("LinearProgressIndicator with undefined progress")
-        Spacer(Modifier.height(30.dp))
-        LinearProgressIndicator(modifier = Modifier.size(100.dp, 10.dp))
-    }
-}
-
-@Preview
-@Composable
-fun ReadableTraversalGroups() {
-    Column {
-        Row(Modifier.semantics { isTraversalGroup = true }.clickable {}) {
-            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
-            Button(onClick = { }) {
-                Text("First button")
-            }
-        }
-    }
-}
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibilityDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibilityDemos.kt
new file mode 100644
index 0000000..2d7be81
--- /dev/null
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/accessibility/ComplexAccessibilityDemos.kt
@@ -0,0 +1,631 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.demos
+
+import android.widget.TextView
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.BottomAppBar
+import androidx.compose.material.Button
+import androidx.compose.material.DrawerValue
+import androidx.compose.material.FabPosition
+import androidx.compose.material.FloatingActionButton
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
+import androidx.compose.material.LinearProgressIndicator
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Scaffold
+import androidx.compose.material.Text
+import androidx.compose.material.TopAppBar
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Add
+import androidx.compose.material.icons.filled.Face
+import androidx.compose.material.rememberDrawerState
+import androidx.compose.material.rememberScaffoldState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.demos.databinding.TestLayoutBinding
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.isTraversalGroup
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.traversalIndex
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.compose.ui.viewinterop.AndroidViewBinding
+import kotlin.math.max
+
+@Composable
+fun LastElementOverLaidColumn(
+    modifier: Modifier = Modifier,
+    content: @Composable () -> Unit,
+) {
+    var yPosition = 0
+
+    Layout(modifier = modifier, content = content) { measurables, constraints ->
+        val placeables = measurables.map { measurable ->
+            measurable.measure(constraints)
+        }
+
+        layout(constraints.maxWidth, constraints.maxHeight) {
+            placeables.forEach { placeable ->
+                if (placeable != placeables[placeables.lastIndex]) {
+                    placeable.placeRelative(x = 0, y = yPosition)
+                    yPosition += placeable.height
+                } else {
+                    // if the element is our last element (our overlaid node)
+                    // then we'll put it over the middle of our previous elements
+                    placeable.placeRelative(x = 0, y = yPosition / 2)
+                }
+            }
+        }
+    }
+}
+
+@Preview
+@Composable
+fun OverlaidNodeLayoutDemo() {
+    LastElementOverLaidColumn(modifier = Modifier.padding(8.dp)) {
+        Row {
+            Column(modifier = Modifier.testTag("Text1")) {
+                Row { Text("text1\n") }
+                Row { Text("text2\n") }
+                Row { Text("text3\n") }
+            }
+        }
+        Row {
+            Text("overlaid node")
+        }
+    }
+}
+
+@Composable
+fun CardRow(
+    modifier: Modifier,
+    columnNumber: Int,
+    topSampleText: String,
+    bottomSampleText: String
+) {
+    Row(
+        modifier,
+        verticalAlignment = Alignment.CenterVertically,
+        horizontalArrangement = Arrangement.End
+    ) {
+        Column {
+            Text(topSampleText + columnNumber)
+            Text(bottomSampleText + columnNumber)
+        }
+    }
+}
+
+@Preview
+@Composable
+fun NestedContainersFalseDemo() {
+    var topSampleText = "Top text in column "
+    var bottomSampleText = "Bottom text in column "
+    Column(
+        Modifier
+            .testTag("Test Tag")
+            .semantics { isTraversalGroup = true }
+    ) {
+        Row() { Modifier.semantics { isTraversalGroup = true }
+            CardRow(
+                Modifier.semantics { isTraversalGroup = false },
+                1,
+                topSampleText,
+                bottomSampleText)
+            CardRow(
+                Modifier.semantics { isTraversalGroup = false },
+                2,
+                topSampleText,
+                bottomSampleText)
+        }
+    }
+}
+
+@Preview
+@Composable
+fun NestedContainersTrueDemo() {
+    var topSampleText = "Top text in column "
+    var bottomSampleText = "Bottom text in column "
+    Column(
+        Modifier
+            .testTag("Test Tag")
+            .semantics { isTraversalGroup = true }
+    ) {
+        Row() { Modifier.semantics { isTraversalGroup = true }
+            CardRow(
+                Modifier.semantics { isTraversalGroup = true },
+                1,
+                topSampleText,
+                bottomSampleText)
+            CardRow(
+                Modifier.semantics { isTraversalGroup = true },
+                2,
+                topSampleText,
+                bottomSampleText)
+        }
+    }
+}
+
+@Composable
+fun TopAppBar() {
+    val topAppBar = "Top App Bar"
+    TopAppBar(
+        title = {
+            Text(text = topAppBar)
+        }
+    )
+}
+
+@Composable
+fun ScrollColumn(padding: PaddingValues) {
+    var counter = 0
+    var sampleText = "Sample text in column"
+    Column(
+        Modifier
+            .verticalScroll(rememberScrollState())
+            .padding(padding)
+            .testTag("Test Tag")
+    ) {
+        repeat(100) {
+            Text(sampleText + counter++)
+        }
+    }
+}
+
+@Preview
+@Composable
+fun ScaffoldSampleDemo() {
+    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+    Scaffold(
+        scaffoldState = scaffoldState,
+        topBar = { TopAppBar() },
+        floatingActionButtonPosition = FabPosition.End,
+        floatingActionButton = { FloatingActionButton(onClick = {}) {
+            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+        } },
+        drawerContent = { Text(text = "Drawer Menu 1") },
+        content = { padding -> Text("Content", modifier = Modifier.padding(padding)) },
+        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
+            Text("Bottom App Bar") } }
+    )
+}
+
+@Preview
+@Composable
+fun ScaffoldSampleScrollDemo() {
+    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+    Scaffold(
+        scaffoldState = scaffoldState,
+        topBar = { TopAppBar() },
+        floatingActionButtonPosition = FabPosition.End,
+        floatingActionButton = { FloatingActionButton(onClick = {}) {
+            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+        } },
+        content = { padding -> ScrollColumn(padding) },
+        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
+            Text("Bottom App Bar") } }
+    )
+}
+
+@Preview
+@Composable
+fun ScrollingColumnDemo() {
+    var sampleText = "Sample text in column"
+    var counter = 0
+
+    Column(
+        Modifier
+            .verticalScroll(rememberScrollState())
+            .testTag("Test Tag")
+    ) {
+        TopAppBar()
+        repeat(100) {
+            Text(sampleText + counter++)
+        }
+    }
+}
+
+@Preview
+@Composable
+fun OverlaidNodeTraversalIndexDemo() {
+    LastElementOverLaidColumn(
+        Modifier
+            .semantics { isTraversalGroup = true }
+            .padding(8.dp)) {
+        Row {
+            Column(modifier = Modifier.testTag("Text1")) {
+                Row { Text("text1\n") }
+                Row { Text("text2\n") }
+                Row { Text("text3\n") }
+            }
+        }
+        // Since default traversalIndex is 0, `traversalIndex = -1f` here means that the overlaid
+        // node is read first, even though visually it's below the other text.
+        // Container needs to be true, otherwise we only read/register significant
+        Row(Modifier.semantics { isTraversalGroup = true; traversalIndex = -1f }) {
+            Text("overlaid node")
+        }
+    }
+}
+
+@Composable
+fun FloatingBox() {
+    Box(modifier = Modifier.semantics { isTraversalGroup = true; traversalIndex = -1f }) {
+        FloatingActionButton(onClick = {}) {
+            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+        }
+    }
+}
+
+@Composable
+fun ContentColumn(padding: PaddingValues) {
+    var counter = 0
+    var sampleText = "Sample text in column"
+    Column(
+        Modifier
+            .verticalScroll(rememberScrollState())
+            .padding(padding)
+            .testTag("Test Tag")
+    ) {
+        // every other value has an explicitly set `traversalIndex`
+        Text(text = sampleText + counter++)
+        Text(text = sampleText + counter++,
+            modifier = Modifier.semantics { traversalIndex = 1f })
+        Text(text = sampleText + counter++)
+        Text(text = sampleText + counter++,
+            modifier = Modifier.semantics { traversalIndex = 1f })
+        Text(text = sampleText + counter++)
+        Text(text = sampleText + counter++,
+            modifier = Modifier.semantics { traversalIndex = 1f })
+        Text(text = sampleText + counter++)
+    }
+}
+
+/**
+ * Example of how `traversalIndex` and traversal groups can be used to customize TalkBack
+ * ordering. The example below puts the FAB into a box (with `isTraversalGroup = true` and a
+ * custom traversal index) to have it appear first when TalkBack is turned on. The
+ * text in the column also has been modified. See go/traversal-index-changes for more detail
+ */
+@Preview
+@Composable
+fun NestedTraversalIndexInheritanceDemo() {
+    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+    Scaffold(
+        scaffoldState = scaffoldState,
+        topBar = { TopAppBar() },
+        floatingActionButtonPosition = FabPosition.End,
+        floatingActionButton = { FloatingBox() },
+        drawerContent = { Text(text = "Drawer Menu 1") },
+        content = { padding -> ContentColumn(padding = padding) },
+        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
+            Text("Bottom App Bar") } }
+    )
+}
+
+@Preview
+@Composable
+fun NestedAndPeerTraversalIndexDemo() {
+    Column(
+        Modifier
+            // Having a traversal index here as 8f shouldn't affect anything; this column
+            // has no other peers that its compared to
+            .semantics { traversalIndex = 8f; isTraversalGroup = true }
+            .padding(8.dp)
+    ) {
+        Row(
+            Modifier.semantics { traversalIndex = 3f; isTraversalGroup = true }
+        ) {
+            Column(modifier = Modifier.testTag("Text1")) {
+                Row { Text("text 3\n") }
+                Row {
+                    Text(text = "text 5\n", modifier = Modifier.semantics { traversalIndex = 1f })
+                }
+                Row { Text("text 4\n") }
+            }
+        }
+        Row {
+            Text(text = "text 2\n", modifier = Modifier.semantics { traversalIndex = 2f })
+        }
+        Row {
+            Text(text = "text 1\n", modifier = Modifier.semantics { traversalIndex = 1f })
+        }
+        Row {
+            Text(text = "text 0\n")
+        }
+    }
+}
+
+@Preview
+@Composable
+fun IconsInScaffoldWithListDemo() {
+    Scaffold(
+        topBar = {
+            Row(
+                horizontalArrangement = Arrangement.SpaceEvenly
+            ) {
+                IconButton(onClick = { }) {
+                    Icon(Icons.Default.Face, contentDescription = "Face 1")
+                }
+                // Setting `clearAndSetSemantics` below means that Face 2 will not be sorted nor
+                // will be read by TalkBack. The final traversal order should go from Face 1 to
+                // Face 3 to the LazyColumn content.
+                IconButton(
+                    onClick = { },
+                    modifier = Modifier.clearAndSetSemantics { }
+                ) {
+                    Icon(Icons.Default.Face, contentDescription = "Face 2")
+                }
+                IconButton(onClick = { }) {
+                    Icon(Icons.Default.Face, contentDescription = "Face 3")
+                }
+            }
+        },
+        content = { innerPadding ->
+            LazyColumn(
+                contentPadding = innerPadding,
+                verticalArrangement = Arrangement.spacedBy(8.dp)
+            ) {
+                val list = (0..75).map { it.toString() }
+                items(count = list.size) {
+                    Text(
+                        text = list[it],
+                        modifier = Modifier
+                            .fillMaxWidth()
+                            .padding(horizontal = 16.dp)
+                    )
+                }
+            }
+        }
+    )
+}
+
+@Composable
+fun InteropColumn(padding: PaddingValues) {
+    Column(
+        Modifier
+            .verticalScroll(rememberScrollState())
+            .padding(padding)
+            .testTag("Test Tag")
+    ) {
+        Button(onClick = { }) {
+            Text("Button that comes before an AndroidViewBinding")
+        }
+
+        AndroidViewBinding(TestLayoutBinding::inflate) {
+            text1.text = "AndroidViewBinding text"
+        }
+
+        Button(onClick = { }) {
+            Text("Button that comes after an AndroidViewBinding and before another TextView")
+        }
+
+        AndroidView(::TextView) {
+            it.text = "This is a text in a TextView"
+        }
+
+        Button(onClick = { }) {
+            Text("Last text button")
+        }
+    }
+}
+
+@Preview
+@Composable
+fun InteropSample() {
+    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+    Scaffold(
+        scaffoldState = scaffoldState,
+        topBar = { TopAppBar() },
+        floatingActionButtonPosition = FabPosition.End,
+        floatingActionButton = { FloatingActionButton(onClick = {}) {
+            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+        } },
+        drawerContent = { Text(text = "Drawer Menu 1") },
+        content = { padding -> InteropColumn(padding) },
+        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
+            Text("Bottom App Bar") } }
+    )
+}
+
+@Composable
+fun InteropColumnBackwards(padding: PaddingValues) {
+    Column(
+        Modifier
+            .verticalScroll(rememberScrollState())
+            .padding(padding)
+            .testTag("Test Tag")
+    ) {
+        Button(
+            modifier = Modifier.semantics { traversalIndex = 4f },
+            onClick = { }
+        ) {
+            Text("Last button after AndroidViewBinding")
+        }
+
+        AndroidViewBinding(
+            TestLayoutBinding::inflate,
+            modifier = Modifier.semantics { traversalIndex = 3f }
+        ) {
+            text1.text = "Fourth — AndroidViewBinding"
+        }
+
+        Button(
+            modifier = Modifier.semantics { traversalIndex = 2f },
+            onClick = { }
+        ) {
+            Text("Third — Compose button")
+        }
+
+        AndroidView(
+            ::TextView,
+            modifier = Modifier.semantics { traversalIndex = 1f }
+        ) {
+            it.text = "Second is a text in a TextView"
+        }
+
+        Button(
+            modifier = Modifier.semantics { traversalIndex = 0f },
+            onClick = { }
+        ) {
+            Text("First button")
+        }
+    }
+}
+
+@Preview
+@Composable
+fun InteropSampleBackwards() {
+    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+    Scaffold(
+        scaffoldState = scaffoldState,
+        topBar = { TopAppBar() },
+        floatingActionButtonPosition = FabPosition.End,
+        floatingActionButton = { FloatingActionButton(onClick = {}) {
+            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+        } },
+        drawerContent = { Text(text = "Drawer Menu 1") },
+        content = { padding -> InteropColumnBackwards(padding) },
+        bottomBar = { BottomAppBar(backgroundColor = MaterialTheme.colors.primary) {
+            Text("Bottom App Bar") } }
+    )
+}
+
+@Preview
+@Composable
+fun LinearProgressIndicatorDemo() {
+    Column(horizontalAlignment = Alignment.CenterHorizontally) {
+        Text("LinearProgressIndicator with undefined progress")
+        Spacer(Modifier.height(30.dp))
+        LinearProgressIndicator(modifier = Modifier.size(100.dp, 10.dp))
+    }
+}
+
+@Preview
+@Composable
+fun ReadableTraversalGroups() {
+    Column {
+        Row(Modifier.semantics { isTraversalGroup = true }.clickable {}) {
+            Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon")
+            Button(onClick = { }) {
+                Text("First button")
+            }
+        }
+    }
+}
+
+@Preview
+@Composable
+fun SimpleRtlLayoutDemo() {
+    Column {
+        Row(Modifier.semantics { isTraversalGroup = true }) {
+            SimpleTestLayout(
+                Modifier
+                    .requiredSize(100.dp)
+            ) {
+                Text("Child 1")
+            }
+            SimpleTestLayout(
+                Modifier
+                    .requiredSize(100.dp)
+            ) {
+                Text("Child 2")
+            }
+            SimpleTestLayout(
+                Modifier
+                    .requiredSize(100.dp)
+            ) {
+                Text("Child 3")
+            }
+        }
+        CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+            // Will display rtlChild3 rtlChild2 rtlChild1, but should be read
+            // from child1 => child2 => child3.
+            Row(Modifier.semantics { isTraversalGroup = true }) {
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(100.dp)
+                ) {
+                    Text("RTL child 1")
+                }
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(100.dp)
+                ) {
+                    Text("RTL child 2")
+                }
+                SimpleTestLayout(
+                    Modifier
+                        .requiredSize(100.dp)
+                ) {
+                    Text("RTL child 3")
+                }
+            }
+        }
+    }
+}
+
+@Composable
+private fun SimpleTestLayout(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
+    Layout(modifier = modifier, content = content) { measurables, constraints ->
+        if (measurables.isEmpty()) {
+            layout(constraints.minWidth, constraints.minHeight) {}
+        } else {
+            val placeables = measurables.map {
+                it.measure(constraints)
+            }
+            val (width, height) = with(placeables) {
+                Pair(
+                    max(
+                        maxByOrNull { it.width }?.width ?: 0,
+                        constraints.minWidth
+                    ),
+                    max(
+                        maxByOrNull { it.height }?.height ?: 0,
+                        constraints.minHeight
+                    )
+                )
+            }
+            layout(width, height) {
+                for (placeable in placeables) {
+                    placeable.placeRelative(0, 0)
+                }
+            }
+        }
+    }
+}
diff --git a/compose/ui/ui/lint-baseline.xml b/compose/ui/ui/lint-baseline.xml
index ba27473..73f6cb2 100644
--- a/compose/ui/ui/lint-baseline.xml
+++ b/compose/ui/ui/lint-baseline.xml
@@ -1,14 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
-
-    <issue
-        id="BanHideTag"
-        message="@hide is not allowed in documentation"
-        errorLine1="    fun findViewByAccessibilityIdTraversal(accessibilityId: Int): View? {"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -57,321 +48,6 @@
 
     <issue
         id="PrimitiveInCollection"
-        message="field pendingHorizontalScrollEvents with type HashMap&lt;Integer, ScrollAxisRange>: replace with IntObjectMap"
-        errorLine1="    private val pendingHorizontalScrollEvents = HashMap&lt;Int, ScrollAxisRange>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field pendingVerticalScrollEvents with type HashMap&lt;Integer, ScrollAxisRange>: replace with IntObjectMap"
-        errorLine1="    private val pendingVerticalScrollEvents = HashMap&lt;Int, ScrollAxisRange>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field bufferedContentCaptureAppearedNodes with type ArrayMap&lt;Integer, ViewStructureCompat>: replace with IntObjectMap"
-        errorLine1="    internal val bufferedContentCaptureAppearedNodes = ArrayMap&lt;Int, ViewStructureCompat>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type ArrayMap&lt;Integer, ViewStructureCompat> of getBufferedContentCaptureAppearedNodes$lint_module: replace with IntObjectMap"
-        errorLine1="    internal val bufferedContentCaptureAppearedNodes = ArrayMap&lt;Int, ViewStructureCompat>()"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field bufferedContentCaptureDisappearedNodes with type ArraySet&lt;Integer>: replace with IntSet"
-        errorLine1="    internal val bufferedContentCaptureDisappearedNodes = ArraySet&lt;Int>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type ArraySet&lt;Integer> of getBufferedContentCaptureDisappearedNodes$lint_module: replace with IntSet"
-        errorLine1="    internal val bufferedContentCaptureDisappearedNodes = ArraySet&lt;Int>()"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method setCurrentSemanticsNodes$lint_module has parameter &lt;set-?> with type Map&lt;Integer, SemanticsNodeWithAdjustedBounds>: replace with IntObjectMap"
-        errorLine1="    /**"
-        errorLine2="    ^">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field currentSemanticsNodes with type Map&lt;Integer, SemanticsNodeWithAdjustedBounds>: replace with IntObjectMap"
-        errorLine1="    internal var currentSemanticsNodes: Map&lt;Int, SemanticsNodeWithAdjustedBounds> = mapOf()"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Map&lt;Integer, SemanticsNodeWithAdjustedBounds> of getCurrentSemanticsNodes$lint_module: replace with IntObjectMap"
-        errorLine1="    internal var currentSemanticsNodes: Map&lt;Int, SemanticsNodeWithAdjustedBounds> = mapOf()"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field paneDisplayed with type ArraySet&lt;Integer>: replace with IntSet"
-        errorLine1="    private var paneDisplayed = ArraySet&lt;Int>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field idToBeforeMap with type HashMap&lt;Integer, Integer>: replace with IntIntMap"
-        errorLine1="    internal var idToBeforeMap = HashMap&lt;Int, Int>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method setIdToBeforeMap$lint_module has parameter &lt;set-?> with type HashMap&lt;Integer, Integer>: replace with IntIntMap"
-        errorLine1="    internal var idToBeforeMap = HashMap&lt;Int, Int>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type HashMap&lt;Integer, Integer> of getIdToBeforeMap$lint_module: replace with IntIntMap"
-        errorLine1="    internal var idToBeforeMap = HashMap&lt;Int, Int>()"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field idToAfterMap with type HashMap&lt;Integer, Integer>: replace with IntIntMap"
-        errorLine1="    internal var idToAfterMap = HashMap&lt;Int, Int>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method setIdToAfterMap$lint_module has parameter &lt;set-?> with type HashMap&lt;Integer, Integer>: replace with IntIntMap"
-        errorLine1="    internal var idToAfterMap = HashMap&lt;Int, Int>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type HashMap&lt;Integer, Integer> of getIdToAfterMap$lint_module: replace with IntIntMap"
-        errorLine1="    internal var idToAfterMap = HashMap&lt;Int, Int>()"
-        errorLine2="                 ~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="constructor SemanticsNodeCopy has parameter currentSemanticsNodes with type Map&lt;Integer, SemanticsNodeWithAdjustedBounds>: replace with IntObjectMap"
-        errorLine1="        currentSemanticsNodes: Map&lt;Int, SemanticsNodeWithAdjustedBounds>"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field children with type Set&lt;Integer>: replace with IntSet"
-        errorLine1="        val children: MutableSet&lt;Int> = mutableSetOf()"
-        errorLine2="                      ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Set&lt;Integer> of getChildren: replace with IntSet"
-        errorLine1="        val children: MutableSet&lt;Int> = mutableSetOf()"
-        errorLine2="                      ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method setPreviousSemanticsNodes$lint_module has parameter &lt;set-?> with type Map&lt;Integer, SemanticsNodeCopy>: replace with IntObjectMap"
-        errorLine1="    // previousSemanticsNodes holds the previous pruned semantics tree so that we can compare the"
-        errorLine2="    ^">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="field previousSemanticsNodes with type Map&lt;Integer, SemanticsNodeCopy>: replace with IntObjectMap"
-        errorLine1="    internal var previousSemanticsNodes: MutableMap&lt;Int, SemanticsNodeCopy> = mutableMapOf()"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Map&lt;Integer, SemanticsNodeCopy> of getPreviousSemanticsNodes$lint_module: replace with IntObjectMap"
-        errorLine1="    internal var previousSemanticsNodes: MutableMap&lt;Int, SemanticsNodeCopy> = mutableMapOf()"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method sortByGeometryGroupings has parameter containerChildrenMapping with type Map&lt;Integer, List&lt;SemanticsNode>>: replace with IntObjectMap"
-        errorLine1="        containerChildrenMapping: MutableMap&lt;Int, MutableList&lt;SemanticsNode>> = mutableMapOf()"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method geometryDepthFirstSearch has parameter containerMapToChildren with type Map&lt;Integer, List&lt;SemanticsNode>>: replace with IntObjectMap"
-        errorLine1="        containerMapToChildren: MutableMap&lt;Int, MutableList&lt;SemanticsNode>>"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable containerMapToChildren with type Map&lt;Integer, List&lt;SemanticsNode>>: replace with IntObjectMap"
-        errorLine1="        val containerMapToChildren = mutableMapOf&lt;Int, MutableList&lt;SemanticsNode>>()"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable currentLabelToActionId with type Map&lt;CharSequence, Integer>: replace with ObjectIntMap"
-        errorLine1="                val currentLabelToActionId = mutableMapOf&lt;CharSequence, Int>()"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable oldLabelToActionId with type Map&lt;CharSequence, ? extends Integer>: replace with ObjectIntMap"
-        errorLine1="                    val oldLabelToActionId = labelToActionId[virtualViewId]"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable availableIds with type List&lt;Integer>: replace with IntList"
-        errorLine1="                    val availableIds = AccessibilityActionsResourceIds.toMutableList()"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable subtreeChangedSemanticsNodesIds with type ArraySet&lt;Integer>: replace with IntSet"
-        errorLine1="            val subtreeChangedSemanticsNodesIds = ArraySet&lt;Int>()"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method sendSubtreeChangeAccessibilityEvents has parameter subtreeChangedSemanticsNodesIds with type ArraySet&lt;Integer>: replace with IntSet"
-        errorLine1="        subtreeChangedSemanticsNodesIds: ArraySet&lt;Int>"
-        errorLine2="                                         ~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable toRemove with type ArraySet&lt;Integer>: replace with IntSet"
-        errorLine1="        val toRemove = ArraySet&lt;Int>()"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="method sendSemanticsPropertyChangeEvents$lint_module has parameter newSemanticsNodes with type Map&lt;Integer, SemanticsNodeWithAdjustedBounds>: replace with IntObjectMap"
-        errorLine1="        newSemanticsNodes: Map&lt;Int, SemanticsNodeWithAdjustedBounds>"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable newChildren with type Set&lt;Integer>: replace with IntSet"
-        errorLine1="        val newChildren: MutableSet&lt;Int> = mutableSetOf()"
-        errorLine2="                         ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="return type Map&lt;Integer, SemanticsNodeWithAdjustedBounds> of getAllUncoveredSemanticsNodesToMap: replace with IntObjectMap"
-        errorLine1="    Map&lt;Int, SemanticsNodeWithAdjustedBounds> {"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable nodes with type Map&lt;Integer, SemanticsNodeWithAdjustedBounds>: replace with IntObjectMap"
-        errorLine1="    val nodes = mutableMapOf&lt;Int, SemanticsNodeWithAdjustedBounds>()"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
         message="field children with type Map&lt;Integer, AutofillNode>: replace with IntObjectMap"
         errorLine1="    val children: MutableMap&lt;Int, AutofillNode> = mutableMapOf()"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -471,24 +147,6 @@
 
     <issue
         id="PrimitiveInCollection"
-        message="variable oldLines with type Map&lt;AlignmentLine, Integer>: replace with ObjectIntMap"
-        errorLine1="                    val oldLines = oldAlignmentLines"
-        errorLine2="                    ^">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable var4a364b23 with type Map&lt;AlignmentLine, Integer>: replace with ObjectIntMap"
-        errorLine1="                    val oldLines = oldAlignmentLines"
-        errorLine2="                                   ^">
-        <location
-            file="src/commonMain/kotlin/androidx/compose/ui/node/LookaheadDelegate.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInCollection"
         message="field cachedAlignmentLinesMap with type Map&lt;AlignmentLine, Integer>: replace with ObjectIntMap"
         errorLine1="    protected val cachedAlignmentLinesMap = mutableMapOf&lt;AlignmentLine, Int>()"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -624,60 +282,6 @@
 
     <issue
         id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable &apos;setSelectionAction&apos; with type AccessibilityAction&lt;Function3&lt;? super Integer, ? super Integer, ? super Boolean, ? extends Boolean>>."
-        errorLine1="            val setSelectionAction ="
-        errorLine2="            ^">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable &apos;scrollAction&apos; with type AccessibilityAction&lt;Function2&lt;? super Float, ? super Float, ? extends Boolean>>."
-        errorLine1="        val scrollAction = semanticsNode.unmergedConfig.getOrNull(SemanticsActions.ScrollBy)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable &apos;setProgressAction&apos; with type AccessibilityAction&lt;Function1&lt;? super Float, ? extends Boolean>>."
-        errorLine1="                    val setProgressAction ="
-        errorLine2="                    ^">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable &apos;canScroll&apos; with type Function2&lt;? super ScrollAxisRange, ? super Float, ? extends Boolean>."
-        errorLine1="                // Will the scrollable scroll when ScrollBy is invoked with the given [amount]?"
-        errorLine2="                ^">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable &apos;scrollAction&apos; with type AccessibilityAction&lt;Function2&lt;? super Float, ? super Float, ? extends Boolean>>."
-        errorLine1="                var scrollAction = scrollableAncestor?.config?.getOrNull(SemanticsActions.ScrollBy)"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable &apos;scrollDelta&apos; with type Function2&lt;? super Float, ? super Float, ? extends Float>."
-        errorLine1="                // Given the desired scroll value to align either side of the target with the"
-        errorLine2="                ^">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in return type Function2&lt;ComposeUiNode, Integer, Unit> of &apos;getSetCompositeKeyHash&apos;."
         errorLine1="        val SetCompositeKeyHash: ComposeUiNode.(Int) -> Unit ="
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlatformTextInputModifierNodeSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlatformTextInputModifierNodeSample.kt
index 84e67f9..097052e 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlatformTextInputModifierNodeSample.kt
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PlatformTextInputModifierNodeSample.kt
@@ -22,10 +22,10 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusEventModifierNode
 import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.platform.PlatformTextInputMethodRequest
 import androidx.compose.ui.platform.PlatformTextInputModifierNode
 import androidx.compose.ui.platform.PlatformTextInputSession
-import androidx.compose.ui.platform.textInputSession
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
+import androidx.compose.ui.platform.runTextInputSession
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
 
@@ -40,12 +40,12 @@
         override fun onFocusEvent(focusState: FocusState) {
             focusedJob?.cancel()
             focusedJob = if (focusState.isFocused) {
-                // textInputSession is a suspend function, so it must be called from a coroutine.
+                // runTextInputSession is a suspend function, so it must be called from a coroutine.
                 // Launching it into this modifier node's coroutine scope ensures the session will
                 // automatically be torn down when the node is detached.
                 coroutineScope.launch {
                     // This will automatically cancel any currently-active session.
-                    textInputSession {
+                    runTextInputSession {
                         launch {
                             // TODO: Observe text field state, call into system to update it as required
                             //  by the platform.
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
index 2c92123..4c4d99f 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
@@ -1885,68 +1885,100 @@
     fun testChildrenSortedByBounds_rtl() {
         // Arrange.
         val rootTag = "root"
-        val childTag1 = "child1"
-        val childTag2 = "child2"
-        val childTag3 = "child3"
-        val rtlChildTag1 = "rtlChild1"
-        val rtlChildTag2 = "rtlChild2"
-        val rtlChildTag3 = "rtlChild3"
+        val childText1 = "child1"
+        val childText2 = "child2"
+        val childText3 = "child3"
+        val rtlChildText1 = "rtlChild1"
+        val rtlChildText2 = "rtlChild2"
+        val rtlChildText3 = "rtlChild3"
         setContent {
             Column(Modifier.testTag(rootTag)) {
-                Row {
+                // Will display child1, child2, child3, and should be read
+                // from child1 => child2 => child3.
+                Row(Modifier.semantics { isTraversalGroup = true }) {
                     SimpleTestLayout(
                         Modifier
                             .requiredSize(100.dp)
-                            .testTag(childTag1)
-                    ) {}
+                    ) {
+                        Text(childText1)
+                    }
                     SimpleTestLayout(
                         Modifier
                             .requiredSize(100.dp)
-                            .testTag(childTag2)
-                    ) {}
+                    ) {
+                        Text(childText2)
+                    }
                     SimpleTestLayout(
                         Modifier
                             .requiredSize(100.dp)
-                            .testTag(childTag3)
-                    ) {}
+                    ) {
+                        Text(childText3)
+                    }
                 }
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                    // Will display rtlChild3 rtlChild2 rtlChild1
-                    Row {
+                    // Will display rtlChild3 rtlChild2 rtlChild1, but should be read
+                    // from child1 => child2 => child3.
+                    Row(Modifier.semantics { isTraversalGroup = true }) {
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .testTag(rtlChildTag1)
-                        ) {}
+                        ) {
+                            Text(rtlChildText1)
+                        }
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .testTag(rtlChildTag2)
-                        ) {}
+                        ) {
+                            Text(rtlChildText2)
+                        }
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .testTag(rtlChildTag3)
-                        ) {}
+                        ) {
+                            Text(rtlChildText3)
+                        }
                     }
                 }
             }
         }
         val root = rule.onNodeWithTag(rootTag).fetchSemanticsNode()
-        val rtlChild1Id = rule.onNodeWithTag(rtlChildTag1).semanticsId
-        val rtlChild2Id = rule.onNodeWithTag(rtlChildTag2).semanticsId
-        val rtlChild3Id = rule.onNodeWithTag(rtlChildTag3).semanticsId
+        val child1Id = rule.onNodeWithText(childText1).semanticsId
+        val child2Id = rule.onNodeWithText(childText2).semanticsId
+        val child3Id = rule.onNodeWithText(childText3).semanticsId
+
+        val rtlChild1Id = rule.onNodeWithText(rtlChildText1).semanticsId
+        val rtlChild2Id = rule.onNodeWithText(rtlChildText2).semanticsId
+        val rtlChild3Id = rule.onNodeWithText(rtlChildText3).semanticsId
 
         // Act.
         rule.waitForIdle()
+        val child1ANI = createAccessibilityNodeInfo(child1Id)
+        val child2ANI = createAccessibilityNodeInfo(child2Id)
+        val child3ANI = createAccessibilityNodeInfo(child3Id)
+
         val rtlChild1ANI = createAccessibilityNodeInfo(rtlChild1Id)
         val rtlChild2ANI = createAccessibilityNodeInfo(rtlChild2Id)
 
         // Assert - Rtl
         rule.runOnIdle {
-            assertThat(root.replacedChildren.size).isEqualTo(6)
-            assertThat(rtlChild1ANI.extras.traversalBefore).isLessThan(rtlChild2Id)
-            assertThat(rtlChild2ANI.extras.traversalBefore).isLessThan(rtlChild3Id)
+            // There should be two traversal groups in the scene.
+            assertThat(root.replacedChildren.size).isEqualTo(2)
+
+            assertThat(child1ANI.extras.traversalBefore).isNotEqualTo(0)
+            assertThat(child2ANI.extras.traversalBefore).isNotEqualTo(0)
+            assertThat(child3ANI.extras.traversalBefore).isNotEqualTo(0)
+
+            assertThat(rtlChild1ANI.extras.traversalBefore).isNotEqualTo(0)
+            assertThat(rtlChild2ANI.extras.traversalBefore).isNotEqualTo(0)
+
+            // The LTR children should be read from child1 => child2 => child3.
+            assertThat(child1ANI.extras.traversalBefore).isEqualTo(child2Id)
+            assertThat(child2ANI.extras.traversalBefore).isEqualTo(child3Id)
+            assertThat(child3ANI.extras.traversalBefore).isEqualTo(rtlChild1Id)
+
+            // We also want the RTL children to be read from child1 => child2 => child3.
+            assertThat(rtlChild1ANI.extras.traversalBefore).isEqualTo(rtlChild2Id)
+            assertThat(rtlChild2ANI.extras.traversalBefore).isEqualTo(rtlChild3Id)
         }
     }
 
@@ -3782,6 +3814,40 @@
     }
 
     @Test
+    fun testAccessibilityNodeInfoTreePruned_testTagOnlyDoesNotPrune() {
+        // Arrange.
+        val parentTag = "ParentForOverlappedChildren"
+        val childOneTag = "OverlappedChildOne"
+        val childTwoTag = "OverlappedChildTwo"
+        setContent {
+            Box(Modifier.testTag(parentTag)) {
+                with(LocalDensity.current) {
+                    Box(
+                        Modifier
+                            .zIndex(1f)
+                            .testTag(childOneTag)
+                            .requiredSize(50.toDp())
+                    )
+                    BasicText(
+                        "Child Two",
+                        Modifier
+                            .testTag(childTwoTag)
+                            .requiredSize(50.toDp())
+                    )
+                }
+            }
+        }
+        val parentNodeId = rule.onNodeWithTag(parentTag).semanticsId
+        val overlappedChildTwoNodeId = rule.onNodeWithTag(childTwoTag).semanticsId
+
+        rule.runOnIdle {
+            assertThat(createAccessibilityNodeInfo(parentNodeId).childCount).isEqualTo(2)
+            assertThat(createAccessibilityNodeInfo(overlappedChildTwoNodeId).text.toString())
+                .isEqualTo("Child Two")
+        }
+    }
+
+    @Test
     fun testPaneAppear() {
         var isPaneVisible by mutableStateOf(false)
         val paneTestTitle by mutableStateOf("pane title")
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
index 6edf095..0e0a75b 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
@@ -36,7 +36,6 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableIntStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
@@ -176,50 +175,6 @@
         }
     }
 
-    @Test
-    fun testVectorSkipsRecompositionOnNoChange() {
-        val state = mutableIntStateOf(0)
-        var composeCount = 0
-        var vectorComposeCount = 0
-
-        val composeVector: @Composable @VectorComposable (Float, Float) -> Unit = {
-                viewportWidth, viewportHeight ->
-
-            vectorComposeCount++
-            Path(
-                fill = SolidColor(Color.Blue),
-                pathData = PathData {
-                    lineTo(viewportWidth, 0f)
-                    lineTo(viewportWidth, viewportHeight)
-                    lineTo(0f, viewportHeight)
-                    close()
-                }
-            )
-        }
-
-        rule.setContent {
-            composeCount++
-            // Arbitrary read to force composition here and verify the subcomposition below skips
-            state.value
-            val vectorPainter = rememberVectorPainter(
-                defaultWidth = 10.dp,
-                defaultHeight = 10.dp,
-                autoMirror = false,
-                content = composeVector
-            )
-            Image(
-                vectorPainter,
-                null,
-                modifier = Modifier.size(20.dp)
-            )
-        }
-
-        state.value = 1
-        rule.waitForIdle()
-        assertEquals(2, composeCount) // Arbitrary state read should compose twice
-        assertEquals(1, vectorComposeCount) // Vector is identical so should compose once
-    }
-
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun testVectorInvalidation() {
@@ -1108,7 +1063,6 @@
         var vectorInCache = false
         rule.setContent {
             val theme = LocalContext.current.theme
-            val density = LocalDensity.current
             val imageVectorCache = LocalImageVectorCache.current
             imageVectorCache.clear()
             Image(
@@ -1116,22 +1070,8 @@
                 contentDescription = null
             )
 
-            val key = ImageVectorCache.Key(theme, R.drawable.ic_triangle, density)
-            vectorInCache = imageVectorCache[key] != null
-        }
-
-        assertTrue(vectorInCache)
-    }
-
-    @Test
-    fun testVectorPainterCacheHit() {
-        var vectorInCache = false
-        rule.setContent {
-            // obtaining the same painter resource should return the same instance root
-            // GroupComponent
-            val painter1 = painterResource(R.drawable.ic_triangle) as VectorPainter
-            val painter2 = painterResource(R.drawable.ic_triangle) as VectorPainter
-            vectorInCache = painter1.vector.root === painter2.vector.root
+            vectorInCache =
+                imageVectorCache[ImageVectorCache.Key(theme, R.drawable.ic_triangle)] != null
         }
 
         assertTrue(vectorInCache)
@@ -1143,10 +1083,8 @@
         var application: Application? = null
         var theme: Resources.Theme? = null
         var vectorCache: ImageVectorCache? = null
-        var density: Density? = null
         rule.setContent {
             application = LocalContext.current.applicationContext as Application
-            density = LocalDensity.current
             theme = LocalContext.current.theme
             val imageVectorCache = LocalImageVectorCache.current
             imageVectorCache.clear()
@@ -1155,8 +1093,8 @@
                 contentDescription = null
             )
 
-            val key = ImageVectorCache.Key(theme!!, R.drawable.ic_triangle, density!!)
-            vectorInCache = imageVectorCache[key] != null
+            vectorInCache =
+                imageVectorCache[ImageVectorCache.Key(theme!!, R.drawable.ic_triangle)] != null
 
             vectorCache = imageVectorCache
         }
@@ -1164,7 +1102,7 @@
         application?.onTrimMemory(0)
 
         val cacheCleared = vectorCache?.let {
-            it[ImageVectorCache.Key(theme!!, R.drawable.ic_triangle, density!!)] == null
+            it[ImageVectorCache.Key(theme!!, R.drawable.ic_triangle)] == null
         } ?: false
 
         assertTrue("Vector was not inserted in cache after initial creation", vectorInCache)
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodTestOverrideTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodTestOverrideTest.kt
index f4f05c7..d1ada36 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodTestOverrideTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputMethodTestOverrideTest.kt
@@ -22,9 +22,10 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.platform.PlatformTextInputMethodRequest
 import androidx.compose.ui.platform.PlatformTextInputModifierNode
 import androidx.compose.ui.platform.PlatformTextInputSession
-import androidx.compose.ui.platform.textInputSession
+import androidx.compose.ui.platform.runTextInputSession
 import androidx.compose.ui.test.ComposeTimeoutException
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.PlatformTextInputMethodTestOverride
@@ -76,7 +77,7 @@
         var inputView: View? = null
         rule.runOnIdle {
             launch {
-                testNode.textInputSession {
+                testNode.runTextInputSession {
                     inputView = view
                     cancelSelf()
                 }
@@ -112,7 +113,7 @@
 
         val testJob = rule.runOnIdle {
             launch {
-                testNode.textInputSession {
+                testNode.runTextInputSession {
                     // This context should be propagated to startInputMethod.
                     withContext(CoroutineName(coroutineName)) {
                         startInputMethod(testRequest)
@@ -144,7 +145,7 @@
 
         val testJob = rule.runOnIdle {
             launch {
-                testNode.textInputSession {
+                testNode.runTextInputSession {
                     startInputMethod(testRequest)
                 }
             }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputViewIntegrationTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputViewIntegrationTest.kt
index 4a4d1f5..1951ec4 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputViewIntegrationTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/PlatformTextInputViewIntegrationTest.kt
@@ -27,7 +27,7 @@
 import androidx.compose.ui.platform.AndroidComposeView
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.PlatformTextInputModifierNode
-import androidx.compose.ui.platform.textInputSession
+import androidx.compose.ui.platform.runTextInputSession
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -70,7 +70,7 @@
         lateinit var view2: View
 
         coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 view1 = view
                 throw CancellationException()
             }
@@ -78,7 +78,7 @@
 
         rule.runOnIdle {
             coroutineScope.launch {
-                node2.textInputSession {
+                node2.runTextInputSession {
                     view2 = view
                     throw CancellationException()
                 }
@@ -100,7 +100,7 @@
         setupContent()
 
         coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 awaitCancellation()
             }
         }
@@ -115,7 +115,7 @@
         setupContent()
 
         coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 startInputMethod(TestInputMethodRequest(view))
             }
         }
@@ -126,7 +126,7 @@
 
         // Handoff session to another node.
         val sessionJob = coroutineScope.launch {
-            node2.textInputSession {
+            node2.runTextInputSession {
                 startInputMethod(TestInputMethodRequest(view))
             }
         }
@@ -153,7 +153,7 @@
     fun createInputConnection_returnsNull_whenNoInnerSessionActive() {
         setupContent()
         coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 awaitCancellation()
             }
         }
@@ -170,7 +170,7 @@
         val request1Texts = mutableListOf<String>()
         val request2Texts = mutableListOf<String>()
         coroutineScope.launch {
-            node2.textInputSession {
+            node2.runTextInputSession {
                 startInputMethod(object : TestInputMethodRequest(view) {
                     override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
                         request1Texts += text.toString()
@@ -190,7 +190,7 @@
         }
 
         val sessionJob = coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 startInputMethod(object : TestInputMethodRequest(view) {
                     override fun commitText(text: CharSequence?, newCursorPosition: Int): Boolean {
                         request2Texts += text.toString()
@@ -222,15 +222,15 @@
         coroutineScope.launch {
             expect(0)
             try {
-                node1.textInputSession {
+                node1.runTextInputSession {
                     expect(1)
                     try {
                         startInputMethod(object : TestInputMethodRequest(view) {
                             override fun createInputConnection(
-                                outAttrs: EditorInfo
+                                outAttributes: EditorInfo
                             ): InputConnection {
                                 expect(2)
-                                return super.createInputConnection(outAttrs)
+                                return super.createInputConnection(outAttributes)
                             }
                         })
                     } catch (e: CancellationException) {
@@ -250,7 +250,7 @@
 
         coroutineScope.launch {
             expect(3)
-            node1.textInputSession {
+            node1.runTextInputSession {
                 expect(6)
                 startInputMethod(TestInputMethodRequest(view))
             }
@@ -268,7 +268,7 @@
         setupContent()
         val sessionJob = coroutineScope.launch {
             try {
-                node1.textInputSession {
+                node1.runTextInputSession {
                     try {
                         startInputMethod(object : TestInputMethodRequest(view) {
                             override fun closeConnection() {
@@ -305,15 +305,15 @@
         coroutineScope.launch {
             expect(0)
             try {
-                node1.textInputSession {
+                node1.runTextInputSession {
                     expect(1)
                     try {
                         startInputMethod(object : TestInputMethodRequest(view) {
                             override fun createInputConnection(
-                                outAttrs: EditorInfo
+                                outAttributes: EditorInfo
                             ): InputConnection {
                                 expect(2)
-                                return super.createInputConnection(outAttrs)
+                                return super.createInputConnection(outAttributes)
                             }
 
                             override fun closeConnection() {
@@ -337,7 +337,7 @@
 
         coroutineScope.launch {
             expect(3)
-            node1.textInputSession {
+            node1.runTextInputSession {
                 expect(7)
                 startInputMethod(TestInputMethodRequest(view))
             }
@@ -353,17 +353,17 @@
         setupContent()
         coroutineScope.launch {
             expect(0)
-            node1.textInputSession {
+            node1.runTextInputSession {
                 expect(1)
                 launch(start = CoroutineStart.UNDISPATCHED) {
                     expect(2)
                     try {
                         startInputMethod(object : TestInputMethodRequest(view) {
                             override fun createInputConnection(
-                                outAttrs: EditorInfo
+                                outAttributes: EditorInfo
                             ): InputConnection {
                                 expect(3)
-                                return super.createInputConnection(outAttrs)
+                                return super.createInputConnection(outAttributes)
                             }
                         })
                     } catch (e: CancellationException) {
@@ -395,7 +395,7 @@
         setupContent()
         lateinit var sessionJob: Job
         coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 sessionJob = launch {
                     try {
                         startInputMethod(object : TestInputMethodRequest(view) {
@@ -430,17 +430,17 @@
         setupContent()
         coroutineScope.launch {
             expect(0)
-            node1.textInputSession {
+            node1.runTextInputSession {
                 expect(1)
                 launch(start = CoroutineStart.UNDISPATCHED) {
                     expect(2)
                     try {
                         startInputMethod(object : TestInputMethodRequest(view) {
                             override fun createInputConnection(
-                                outAttrs: EditorInfo
+                                outAttributes: EditorInfo
                             ): InputConnection {
                                 expect(3)
-                                return super.createInputConnection(outAttrs)
+                                return super.createInputConnection(outAttributes)
                             }
 
                             override fun closeConnection() {
@@ -484,7 +484,7 @@
         setupContent()
         val connections = mutableListOf<TestConnection>()
         val sessionJob = coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 startInputMethod {
                     TestConnection(view).also { connections += it }
                 }
@@ -527,7 +527,7 @@
         setupContent()
         lateinit var innerJob: Job
         val outerJob = coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 innerJob = launch {
                     startInputMethod(TestInputMethodRequest(view))
                 }
@@ -554,7 +554,7 @@
     fun cancellationPropagates_whenConnectionClosed() {
         setupContent()
         val sessionJob = coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 startInputMethod(TestInputMethodRequest(view))
             }
         }
@@ -574,12 +574,14 @@
     fun createInputConnection_queriesNewRequest_forNewInnerSession() {
         setupContent()
         coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 launch(start = CoroutineStart.UNDISPATCHED) {
                     startInputMethod(object : TestInputMethodRequest(view) {
-                        override fun createInputConnection(outAttrs: EditorInfo): InputConnection {
+                        override fun createInputConnection(
+                            outAttributes: EditorInfo
+                        ): InputConnection {
                             expect(1)
-                            return super.createInputConnection(outAttrs)
+                            return super.createInputConnection(outAttributes)
                         }
                     })
                 }
@@ -589,9 +591,11 @@
 
                 launch(start = CoroutineStart.UNDISPATCHED) {
                     startInputMethod(object : TestInputMethodRequest(view) {
-                        override fun createInputConnection(outAttrs: EditorInfo): InputConnection {
+                        override fun createInputConnection(
+                            outAttributes: EditorInfo
+                        ): InputConnection {
                             expect(3)
-                            return super.createInputConnection(outAttrs)
+                            return super.createInputConnection(outAttributes)
                         }
                     })
                 }
@@ -613,11 +617,12 @@
     fun createInputConnection_returnsDifferentConnections_forSameInnerSession() {
         setupContent()
         coroutineScope.launch {
-            node1.textInputSession {
+            node1.runTextInputSession {
                 launch {
                     startInputMethod(object : TestInputMethodRequest(view) {
-                        override fun createInputConnection(outAttrs: EditorInfo): InputConnection =
-                            BaseInputConnection(view, true)
+                        override fun createInputConnection(
+                            outAttributes: EditorInfo
+                        ): InputConnection = BaseInputConnection(view, true)
                     })
                 }
                 awaitCancellation()
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/TestInputMethodRequest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/TestInputMethodRequest.kt
index f33098c..4a0a8d1 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/TestInputMethodRequest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/TestInputMethodRequest.kt
@@ -20,11 +20,12 @@
 import android.view.inputmethod.BaseInputConnection
 import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.InputConnection
+import androidx.compose.ui.platform.PlatformTextInputMethodRequest
 
 internal open class TestInputMethodRequest(view: View) : BaseInputConnection(view, false),
     PlatformTextInputMethodRequest {
 
-    override fun createInputConnection(outAttrs: EditorInfo): InputConnection {
+    override fun createInputConnection(outAttributes: EditorInfo): InputConnection {
         return this
     }
 }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
index d4135a8..f530f0d 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
@@ -31,7 +31,6 @@
 import android.view.ViewGroup
 import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
 import android.view.accessibility.AccessibilityNodeInfo
-import android.widget.EditText
 import android.widget.FrameLayout
 import android.widget.RelativeLayout
 import android.widget.TextView
@@ -111,7 +110,6 @@
 import androidx.savedstate.findViewTreeSavedStateRegistryOwner
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.action.ViewActions.typeText
 import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
 import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.matcher.ViewMatchers.Visibility
@@ -123,13 +121,16 @@
 import androidx.test.filters.LargeTest
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
+import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertThat
 import kotlin.math.roundToInt
 import kotlin.test.assertIs
+import kotlin.test.assertNull
 import org.hamcrest.CoreMatchers.endsWith
 import org.hamcrest.CoreMatchers.equalTo
 import org.hamcrest.CoreMatchers.instanceOf
 import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
 import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
@@ -877,10 +878,9 @@
                 if (currentScreen == "screen1") {
                     AndroidView({
                         StateSavingView(
-                            "testKey",
-                            "testValue",
-                            { restoredValue -> result = restoredValue },
-                            it
+                            context = it,
+                            value = "testValue",
+                            onRestoredValue = { restoredValue -> result = restoredValue }
                         )
                     })
                 } else {
@@ -1470,8 +1470,8 @@
             val movableContext = remember {
                 movableContentOf {
                     ReusableAndroidViewWithLifecycleTracking(
-                        factory = {
-                            EditText(it).apply { id = R.id.testContentViewId }
+                        factory = { context ->
+                            StateSavingView(context, "")
                         },
                         onLifecycleEvent = lifecycleEvents::add
                     )
@@ -1491,9 +1491,15 @@
             }
         }
 
-        onView(instanceOf(EditText::class.java))
-            .check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
-            .perform(typeText("Input"))
+        rule.activityRule.withActivity {
+            val view = findViewById<StateSavingView>(StateSavingView.ID)
+            assertEquals(
+                "View didn't have the expected initial value",
+                "",
+                view.value
+            )
+            view.value = "Value 1"
+        }
 
         assertEquals(
             "AndroidView did not experience the expected lifecycle when " +
@@ -1511,7 +1517,7 @@
         lifecycleEvents.clear()
         slotWithContent++
 
-        rule.runOnIdle { /* Wait for UI to settle */ }
+        rule.waitForIdle()
 
         assertEquals(
             "AndroidView experienced unexpected lifecycle events when " +
@@ -1521,44 +1527,67 @@
         )
 
         // Check that the state of the view is retained
-        onView(instanceOf(EditText::class.java))
-            .check(matches(isDisplayed()))
-            .check(matches(withText("Input")))
+        rule.activityRule.withActivity {
+            val view = findViewById<StateSavingView>(StateSavingView.ID)
+            assertEquals(
+                "View didn't retain its state across reuse",
+                "Value 1",
+                view.value
+            )
+        }
     }
 
     @Test
     fun testViewRestoresState_whenRemovedAndRecreatedWithNoReuse() {
-        val lifecycleEvents = mutableListOf<AndroidViewLifecycleEvent>()
         var screen by mutableStateOf("screen1")
         rule.setContent {
             with(rememberSaveableStateHolder()) {
                 if (screen == "screen1") {
                     SaveableStateProvider("screen1") {
-                        ReusableAndroidViewWithLifecycleTracking(
-                            factory = {
-                                EditText(it).apply { id = R.id.testContentViewId }
+                        AndroidView(
+                            factory = { context ->
+                                StateSavingView(context, "screen1 first value")
                             },
-                            onLifecycleEvent = lifecycleEvents::add
+                            update = { },
+                            onReset = { },
+                            onRelease = { }
                         )
                     }
                 }
             }
         }
 
-        onView(instanceOf(EditText::class.java))
-            .check(matches(isDisplayed()))
-            .perform(typeText("User Input"))
+        rule.activityRule.withActivity {
+            val view = findViewById<StateSavingView>(StateSavingView.ID)
+            assertEquals(
+                "View didn't have the expected initial value",
+                "screen1 first value",
+                view.value
+            )
+            view.value = "screen1 new value"
+        }
 
         rule.runOnIdle { screen = "screen2" }
+        rule.waitForIdle()
 
-        onView(instanceOf(EditText::class.java))
-            .check(doesNotExist())
+        rule.activityRule.withActivity {
+            assertNull(
+                findViewById<StateSavingView>(StateSavingView.ID),
+                "StateSavingView should be removed from the hierarchy"
+            )
+        }
 
         rule.runOnIdle { screen = "screen1" }
+        rule.waitForIdle()
 
-        onView(instanceOf(EditText::class.java))
-            .check(matches(isDisplayed()))
-            .check(matches(withText("User Input")))
+        rule.activityRule.withActivity {
+            val view = findViewById<StateSavingView>(StateSavingView.ID)
+            assertEquals(
+                "View did not restore with the correct state",
+                "screen1 new value",
+                view.value
+            )
+        }
     }
 
     @Test
@@ -1741,27 +1770,33 @@
     }
 
     private class StateSavingView(
-        private val key: String,
-        private val value: String,
-        private val onRestoredValue: (String) -> Unit,
-        context: Context
+        context: Context,
+        var value: String = "",
+        private val onRestoredValue: (String) -> Unit = {}
     ) : View(context) {
         init {
-            id = 73
+            id = ID
         }
 
         override fun onSaveInstanceState(): Parcelable {
             val superState = super.onSaveInstanceState()
             val bundle = Bundle()
             bundle.putParcelable("superState", superState)
-            bundle.putString(key, value)
+            bundle.putString(KEY, value)
             return bundle
         }
 
         @Suppress("DEPRECATION")
         override fun onRestoreInstanceState(state: Parcelable?) {
             super.onRestoreInstanceState((state as Bundle).getParcelable("superState"))
-            onRestoredValue(state.getString(key)!!)
+            val value = state.getString(KEY)!!
+            this.value = value
+            onRestoredValue(value)
+        }
+
+        companion object {
+            const val ID = 73
+            private const val KEY: String = "StateSavingView.Key"
         }
     }
 
diff --git a/compose/ui/ui/src/androidInstrumentedTest/res/values/ids.xml b/compose/ui/ui/src/androidInstrumentedTest/res/values/ids.xml
deleted file mode 100644
index 12d037f..0000000
--- a/compose/ui/ui/src/androidInstrumentedTest/res/values/ids.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  Copyright 2023 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<resources>
-    <item name="testContentViewId" type="id"/>
-</resources>
\ No newline at end of file
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 4da8e1b..d38b388 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
@@ -626,13 +626,6 @@
             // Support for this feature in Compose is tracked here: b/207654434
             AndroidComposeViewForceDarkModeQ.disallowForceDark(this)
         }
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-            AndroidComposeViewTranslationCallbackS.setViewTranslationCallback(
-                this,
-                AndroidComposeViewTranslationCallback()
-            )
-        }
     }
 
     /**
@@ -1374,6 +1367,13 @@
         viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener)
         viewTreeObserver.addOnScrollChangedListener(scrollChangedListener)
         viewTreeObserver.addOnTouchModeChangeListener(touchModeChangeListener)
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            AndroidComposeViewTranslationCallbackS.setViewTranslationCallback(
+                this,
+                AndroidComposeViewTranslationCallback()
+            )
+        }
     }
 
     override fun onDetachedFromWindow() {
@@ -1389,6 +1389,10 @@
         viewTreeObserver.removeOnGlobalLayoutListener(globalLayoutListener)
         viewTreeObserver.removeOnScrollChangedListener(scrollChangedListener)
         viewTreeObserver.removeOnTouchModeChangeListener(touchModeChangeListener)
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            AndroidComposeViewTranslationCallbackS.clearViewTranslationCallback(this)
+        }
     }
 
     override fun onProvideAutofillVirtualStructure(structure: ViewStructure?, flags: Int) {
@@ -1743,7 +1747,7 @@
     override fun onCheckIsTextEditor(): Boolean {
         val parentSession = textInputSessionMutex.currentSession
             ?: return legacyTextInputServiceAndroid.isEditorFocused()
-        // Don't bring this up before the ?: – textInputSession has been called, but
+        // Don't bring this up before the ?: – runTextInputSession has been called, but
         // startInputMethod has not, we're not a text editor until the session is cancelled or
         // startInputMethod is called.
         return parentSession.isReadyForConnection
@@ -2084,6 +2088,12 @@
     fun setViewTranslationCallback(view: View, translationCallback: ViewTranslationCallback) {
         view.setViewTranslationCallback(translationCallback)
     }
+
+    @DoNotInline
+    @RequiresApi(Build.VERSION_CODES.S)
+    fun clearViewTranslationCallback(view: View) {
+        view.clearViewTranslationCallback()
+    }
 }
 
 /**
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 ee5959a..ea2f34b 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
@@ -563,13 +563,22 @@
             // we need to fix this since this is called during sorting
             val ab = a.boundsInWindow
             val bb = b.boundsInWindow
-            var r = ab.right.compareTo(bb.right)
+            // We want to compare the right-most bounds, with the largest values first — that way
+            // the nodes will be sorted from right to left. Since `compareTo` returns a positive
+            // number if the first object is greater than the second, we want to call
+            // `b.compareTo(a)`, since we want our values in descending order, rather than
+            // ascending order.
+            var r = bb.right.compareTo(ab.right)
             if (r != 0) return r
+            // Since in RTL layouts we still read from top to bottom, we compare the top and
+            // bottom bounds as usual.
             r = ab.top.compareTo(bb.top)
             if (r != 0) return r
             r = ab.bottom.compareTo(bb.bottom)
             if (r != 0) return r
-            return ab.left.compareTo(bb.left)
+            // We also want to sort the left bounds in descending order, so call `b.compareTo(a)`
+            // here too.
+            return bb.left.compareTo(ab.left)
         }
     }
 
@@ -692,10 +701,11 @@
 
     private fun geometryDepthFirstSearch(
         currNode: SemanticsNode,
-        layoutIsRtl: Boolean,
         geometryList: ArrayList<SemanticsNode>,
         containerMapToChildren: MutableMap<Int, MutableList<SemanticsNode>>
     ) {
+        val currRTL = currNode.isRtl
+
         // We only want to add children that are either traversalGroups or are
         // screen reader focusable. The child must also be in the current pruned semantics tree.
         val isTraversalGroup = currNode.isTraversalGroup
@@ -706,13 +716,13 @@
         if (isTraversalGroup) {
             // Recurse and record the container's children, sorted
             containerMapToChildren[currNode.id] = subtreeSortedByGeometryGrouping(
-                layoutIsRtl, currNode.children.toMutableList()
+                currRTL, currNode.children.toMutableList()
             )
         } else {
             // Otherwise, continue adding children to the list that'll be sorted regardless of
             // hierarchy
             currNode.children.fastForEach { child ->
-                geometryDepthFirstSearch(child, layoutIsRtl, geometryList, containerMapToChildren)
+                geometryDepthFirstSearch(child, geometryList, containerMapToChildren)
             }
         }
     }
@@ -734,7 +744,7 @@
         val geometryList = ArrayList<SemanticsNode>()
 
         listToSort.fastForEach { node ->
-            geometryDepthFirstSearch(node, layoutIsRtl, geometryList, containerMapToChildren)
+            geometryDepthFirstSearch(node, geometryList, containerMapToChildren)
         }
 
         return sortByGeometryGroupings(layoutIsRtl, geometryList, containerMapToChildren)
@@ -747,10 +757,10 @@
         val hostSemanticsNode =
             currentSemanticsNodes[AccessibilityNodeProviderCompat.HOST_VIEW_ID]
                 ?.semanticsNode!!
-        val layoutIsRtl = hostSemanticsNode.isRtl
+        val hostLayoutIsRtl = hostSemanticsNode.isRtl
 
         val semanticsOrderList = subtreeSortedByGeometryGrouping(
-            layoutIsRtl, mutableListOf(hostSemanticsNode)
+            hostLayoutIsRtl, mutableListOf(hostSemanticsNode)
         )
 
         // Iterate through our ordered list, and creating a mapping of current node to next node ID
@@ -820,9 +830,7 @@
         //       are also non-speakable.
         // * Non-merging nodes that are empty: notably, clearAndSetSemantics {}
         //   and the root of the SemanticsNode tree.
-        info.isImportantForAccessibility =
-            semanticsNode.unmergedConfig.isMergingSemanticsOfDescendants ||
-            semanticsNode.unmergedConfig.containsImportantForAccessibility()
+        info.isImportantForAccessibility = semanticsNode.isImportantForAccessibility()
 
         semanticsNode.replacedChildren.fastForEach { child ->
             if (currentSemanticsNodes.contains(child.id)) {
@@ -2933,17 +2941,11 @@
             structure.setTextStyle(px, 0, 0, 0)
         }
 
-        try {
-            // TODO(b/302117973): fix inconsistent state between LayoutNode and its Modifier.Node.
-            with(boundsInParent) {
-                structure.setDimens(
-                    left.toInt(), top.toInt(), 0, 0, width.toInt(), height.toInt()
-                )
-            }
-        } catch (e: IllegalStateException) {
-            Log.e(LogTag, "Fetching bounds on an unattached node!")
+        with(boundsInParent) {
+            structure.setDimens(
+                left.toInt(), top.toInt(), 0, 0, width.toInt(), height.toInt()
+            )
         }
-
         return structure
     }
 
@@ -3552,6 +3554,10 @@
 
 private fun SemanticsNode.enabled() = (config.getOrNull(SemanticsProperties.Disabled) == null)
 
+private fun SemanticsNode.isImportantForAccessibility() =
+    unmergedConfig.isMergingSemanticsOfDescendants ||
+    unmergedConfig.containsImportantForAccessibility()
+
 @OptIn(ExperimentalComposeUiApi::class)
 private val SemanticsNode.isVisible: Boolean
     get() = !isTransparent && !unmergedConfig.contains(SemanticsProperties.InvisibleToUser)
@@ -3667,7 +3673,9 @@
             for (i in children.size - 1 downTo 0) {
                 findAllSemanticNodesRecursive(children[i], region)
             }
-            unaccountedSpace.op(left, top, right, bottom, Region.Op.DIFFERENCE)
+            if (currentNode.isImportantForAccessibility()) {
+                unaccountedSpace.op(left, top, right, bottom, Region.Op.DIFFERENCE)
+            }
         } else {
             if (currentNode.isFake) {
                 val parentNode = currentNode.parent
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidPlatformTextInputSession.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidPlatformTextInputSession.kt
index d89995e..550a026 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidPlatformTextInputSession.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidPlatformTextInputSession.kt
@@ -24,7 +24,6 @@
 import androidx.compose.ui.node.Owner
 import androidx.compose.ui.text.InternalTextApi
 import androidx.compose.ui.text.input.NullableInputConnectionWrapper
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
 import androidx.compose.ui.text.input.TextInputService
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.cancel
@@ -34,7 +33,7 @@
  * Manages a top-level input session, as created by [Owner.textInputSession].
  *
  * On Android there are three levels of input sessions:
- * 1. [PlatformTextInputModifierNode.textInputSession]: The app is performing some initialization
+ * 1. [PlatformTextInputModifierNode.runTextInputSession]: The app is performing some initialization
  *   before requesting the keyboard.
  * 2. [PlatformTextInputSession.startInputMethod]: The app has requested the keyboard with a
  *   particular implementation for [View.onCreateInputConnection] represented by a
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt
new file mode 100644
index 0000000..2813d78
--- /dev/null
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.platform
+
+import android.view.View
+import android.view.inputmethod.EditorInfo
+import android.view.inputmethod.InputConnection
+
+/**
+ * Represents a request to open an Android text input session via
+ * `PlatformTextInputSession.startInputMethod`.
+ */
+actual fun interface PlatformTextInputMethodRequest {
+
+    /**
+     * Called when the platform requests an [InputConnection] via [View.onCreateInputConnection].
+     *
+     * This method makes stricter ordering guarantees about the lifetime of the returned
+     * [InputConnection] than Android does, to make working with connections simpler. Namely, it
+     * guarantees:
+     *  - For a given [PlatformTextInputMethodRequest] instance, only one [InputConnection] will
+     *    ever be active at a time.
+     *  - References to an [InputConnection] will be cleared as soon as the connection becomes
+     *    inactive. Even if Android leaks its reference to the connection, the connection returned
+     *    from this method will not be leaked.
+     *  - On API levels that support [InputConnection.closeConnection] (24+), a connection will
+     *    always be closed before a new connection is requested.
+     *
+     * Android may call [View.onCreateInputConnection] multiple times for the same session – each
+     * system call will result in a 1:1 call to this method, although the old connection will always
+     * be closed first.
+     *
+     * @param outAttributes The [EditorInfo] from [View.onCreateInputConnection].
+     *
+     * @return The [InputConnection] that will be used to talk to the IME as long as the session is
+     * active. This connection will not receive any calls after the requesting coroutine is
+     * cancelled.
+     */
+    fun createInputConnection(outAttributes: EditorInfo): InputConnection
+}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputSession.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputSession.android.kt
index ea9cf2f..54e6566 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputSession.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/PlatformTextInputSession.android.kt
@@ -18,7 +18,6 @@
 
 import android.view.View
 import android.view.inputmethod.InputMethodManager
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
 
 actual interface PlatformTextInputSession {
     /**
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
index 3f330b4..32dcbe67 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/PainterResources.android.kt
@@ -26,15 +26,12 @@
 import androidx.compose.ui.graphics.nativeCanvas
 import androidx.compose.ui.graphics.painter.BitmapPainter
 import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.graphics.vector.GroupComponent
+import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.graphics.vector.VectorPainter
 import androidx.compose.ui.graphics.vector.compat.seekToStartTag
-import androidx.compose.ui.graphics.vector.createGroupComponent
-import androidx.compose.ui.graphics.vector.createVectorPainterFromImageVector
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
 import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalImageVectorCache
-import androidx.compose.ui.res.ImageVectorCache.ImageVectorEntry
 
 /**
  * Create a [Painter] from an Android resource id. This can load either an instance of
@@ -65,7 +62,8 @@
     val path = value.string
     // Assume .xml suffix implies loading a VectorDrawable resource
     return if (path?.endsWith(".xml") == true) {
-        obtainVectorPainter(context.theme, res, id, value.changingConfigurations)
+        val imageVector = loadVectorResource(context.theme, res, id, value.changingConfigurations)
+        rememberVectorPainter(imageVector)
     } else {
         // Otherwise load the bitmap resource
         val imageBitmap = remember(path, id, context.theme) {
@@ -76,42 +74,29 @@
 }
 
 /**
- * Helper method to load the previously cached VectorPainter instance if it exists, otherwise
- * this parses the xml into an ImageVector and creates a new VectorPainter inserting it into the
- * cache for reuse
+ * Helper method to validate that the xml resource is a vector drawable then load
+ * the ImageVector. Because this throws exceptions we cannot have this implementation as part of
+ * the composable implementation it is invoked in.
  */
 @Composable
-private fun obtainVectorPainter(
+private fun loadVectorResource(
     theme: Resources.Theme,
     res: Resources,
     id: Int,
     changingConfigurations: Int
-): VectorPainter {
+): ImageVector {
     val imageVectorCache = LocalImageVectorCache.current
-    val density = LocalDensity.current
-    val key = remember(theme, id, density) {
-        ImageVectorCache.Key(theme, id, density)
-    }
-    val imageVectorEntry = imageVectorCache[key]
-    var imageVector = imageVectorEntry?.imageVector
-    if (imageVector == null) {
+    val key = ImageVectorCache.Key(theme, id)
+    var imageVectorEntry = imageVectorCache[key]
+    if (imageVectorEntry == null) {
         @Suppress("ResourceType") val parser = res.getXml(id)
         if (parser.seekToStartTag().name != "vector") {
             throw IllegalArgumentException(errorMessage)
         }
-        imageVector = loadVectorResourceInner(theme, res, parser)
+        imageVectorEntry = loadVectorResourceInner(theme, res, parser, changingConfigurations)
+        imageVectorCache[key] = imageVectorEntry
     }
-
-    var rootGroup = imageVectorEntry?.rootGroup
-    if (rootGroup == null) {
-        rootGroup = GroupComponent().apply {
-            createGroupComponent(imageVector.root)
-        }
-        imageVectorCache[key] = ImageVectorEntry(imageVector, changingConfigurations, rootGroup)
-    }
-    return remember(key) {
-        createVectorPainterFromImageVector(density, imageVector, rootGroup)
-    }
+    return imageVectorEntry.imageVector
 }
 
 /**
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
index 9c5cfdd..eeb02ee 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/res/VectorResources.android.kt
@@ -24,7 +24,6 @@
 import androidx.annotation.DrawableRes
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
-import androidx.compose.ui.graphics.vector.GroupComponent
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.graphics.vector.compat.AndroidVectorParser
 import androidx.compose.ui.graphics.vector.compat.createVectorImageBuilder
@@ -32,9 +31,6 @@
 import androidx.compose.ui.graphics.vector.compat.parseCurrentVectorNode
 import androidx.compose.ui.graphics.vector.compat.seekToStartTag
 import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.LocalImageVectorCache
-import androidx.compose.ui.unit.Density
 import java.lang.ref.WeakReference
 import org.xmlpull.v1.XmlPullParserException
 
@@ -50,26 +46,13 @@
  */
 @Composable
 fun ImageVector.Companion.vectorResource(@DrawableRes id: Int): ImageVector {
-    val imageCache = LocalImageVectorCache.current
     val context = LocalContext.current
-    val density = LocalDensity.current
     val res = resources()
     val theme = context.theme
-    val key = remember(theme, id, density) {
-        ImageVectorCache.Key(theme, id, density)
+
+    return remember(id, res, theme, res.configuration) {
+        vectorResource(theme, res, id)
     }
-    var imageVector = imageCache[key]?.imageVector
-    if (imageVector == null) {
-        val value = remember { TypedValue() }
-        res.getValue(id, value, true)
-        imageVector = vectorResource(theme, res, id)
-        imageCache[key] = ImageVectorCache.ImageVectorEntry(
-            imageVector,
-            value.changingConfigurations,
-            null
-        )
-    }
-    return imageVector
 }
 
 @Throws(XmlPullParserException::class)
@@ -78,11 +61,15 @@
     res: Resources,
     resId: Int
 ): ImageVector {
+    val value = TypedValue()
+    res.getValue(resId, value, true)
+
     return loadVectorResourceInner(
         theme,
         res,
         res.getXml(resId).apply { seekToStartTag() },
-    )
+        value.changingConfigurations
+    ).imageVector
 }
 
 /**
@@ -94,8 +81,9 @@
 internal fun loadVectorResourceInner(
     theme: Resources.Theme? = null,
     res: Resources,
-    parser: XmlResourceParser
-): ImageVector {
+    parser: XmlResourceParser,
+    changingConfigurations: Int
+): ImageVectorCache.ImageVectorEntry {
     val attrs = Xml.asAttributeSet(parser)
     val resourceParser = AndroidVectorParser(parser)
     val builder = resourceParser.createVectorImageBuilder(res, theme, attrs)
@@ -111,7 +99,7 @@
         )
         parser.next()
     }
-    return builder.build()
+    return ImageVectorCache.ImageVectorEntry(builder.build(), changingConfigurations)
 }
 
 /**
@@ -125,8 +113,7 @@
      */
     data class Key(
         val theme: Resources.Theme,
-        val id: Int,
-        val density: Density
+        val id: Int
     )
 
     /**
@@ -136,8 +123,7 @@
      */
     data class ImageVectorEntry(
         val imageVector: ImageVector,
-        val configFlags: Int,
-        val rootGroup: GroupComponent?,
+        val configFlags: Int
     )
 
     private val map = HashMap<Key, WeakReference<ImageVectorEntry>>()
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusDirection.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusDirection.kt
index 3167c26..0d916b3 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusDirection.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusDirection.kt
@@ -109,33 +109,5 @@
         @get:ExperimentalComposeUiApi
         @ExperimentalComposeUiApi
         val Exit: FocusDirection = FocusDirection(8)
-
-        /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you are searching for the
-         *  next focusable item that is a child of the currently focused item.
-         */
-        @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET", "Unused")
-        @get:ExperimentalComposeUiApi
-        @ExperimentalComposeUiApi
-        @Deprecated(
-            "Use FocusDirection.Enter instead.",
-            ReplaceWith("Enter", "androidx.compose.ui.focus.FocusDirection.Companion.Enter"),
-            DeprecationLevel.WARNING
-        )
-        val In: FocusDirection = Enter
-
-        /**
-         *  Direction used in [FocusManager.moveFocus] to indicate that you want to move focus to
-         *  the parent of the currently focused item.
-         */
-        @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET", "Unused")
-        @get:ExperimentalComposeUiApi
-        @ExperimentalComposeUiApi
-        @Deprecated(
-            "Use FocusDirection.Exit instead.",
-            ReplaceWith("Exit", "androidx.compose.ui.focus.FocusDirection.Companion.Exit"),
-            DeprecationLevel.WARNING
-        )
-        val Out: FocusDirection = Exit
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/Vector.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/Vector.kt
index fd2d8fb..def8917 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/Vector.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/Vector.kt
@@ -19,7 +19,6 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
-import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.geometry.Size.Companion.Unspecified
 import androidx.compose.ui.graphics.BlendMode
@@ -37,7 +36,6 @@
 import androidx.compose.ui.graphics.StrokeJoin
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.Stroke
-import androidx.compose.ui.graphics.drawscope.scale
 import androidx.compose.ui.graphics.drawscope.withTransform
 import androidx.compose.ui.graphics.isSpecified
 import androidx.compose.ui.graphics.isUnspecified
@@ -94,15 +92,20 @@
     abstract fun DrawScope.draw()
 }
 
-internal class VectorComponent(val root: GroupComponent) : VNode() {
-
-    init {
-        root.invalidateListener = {
+internal class VectorComponent : VNode() {
+    val root = GroupComponent().apply {
+        pivotX = 0.0f
+        pivotY = 0.0f
+        invalidateListener = {
             doInvalidate()
         }
     }
 
-    var name: String = DefaultGroupName
+    var name: String
+        get() = root.name
+        set(value) {
+            root.name = value
+        }
 
     private fun doInvalidate() {
         isDirty = true
@@ -128,18 +131,11 @@
 
     private var previousDrawSize = Unspecified
 
-    private var rootScaleX = 1f
-    private var rootScaleY = 1f
-
     /**
      * Cached lambda used to avoid allocating the lambda on each draw invocation
      */
     private val drawVectorBlock: DrawScope.() -> Unit = {
-        with(root) {
-            scale(rootScaleX, rootScaleY, pivot = Offset.Zero) {
-                draw()
-            }
-        }
+        with(root) { draw() }
     }
 
     fun DrawScope.draw(alpha: Float, colorFilter: ColorFilter?) {
@@ -159,8 +155,8 @@
             } else {
                 null
             }
-            rootScaleX = size.width / viewportSize.width
-            rootScaleY = size.height / viewportSize.height
+            root.scaleX = size.width / viewportSize.width
+            root.scaleY = size.height / viewportSize.height
             cacheDrawScope.drawCachedImage(
                 targetImageConfig,
                 IntSize(ceil(size.width).toInt(), ceil(size.height).toInt()),
@@ -270,23 +266,29 @@
 
     var trimPathStart = DefaultTrimPathStart
         set(value) {
-            field = value
-            isTrimPathDirty = true
-            invalidate()
+            if (field != value) {
+                field = value
+                isTrimPathDirty = true
+                invalidate()
+            }
         }
 
     var trimPathEnd = DefaultTrimPathEnd
         set(value) {
-            field = value
-            isTrimPathDirty = true
-            invalidate()
+            if (field != value) {
+                field = value
+                isTrimPathDirty = true
+                invalidate()
+            }
         }
 
     var trimPathOffset = DefaultTrimPathOffset
         set(value) {
-            field = value
-            isTrimPathDirty = true
-            invalidate()
+            if (field != value) {
+                field = value
+                isTrimPathDirty = true
+                invalidate()
+            }
         }
 
     private var isPathDirty = true
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
index fbc1930..35225ac 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/VectorPainter.kt
@@ -19,6 +19,8 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ComposableOpenTarget
 import androidx.compose.runtime.Composition
+import androidx.compose.runtime.CompositionContext
+import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableIntStateOf
 import androidx.compose.runtime.mutableStateOf
@@ -33,11 +35,9 @@
 import androidx.compose.ui.graphics.ImageBitmapConfig
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.scale
-import androidx.compose.ui.graphics.isSpecified
 import androidx.compose.ui.graphics.painter.Painter
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.LayoutDirection
 
@@ -127,36 +127,27 @@
     content: @Composable @VectorComposable (viewportWidth: Float, viewportHeight: Float) -> Unit
 ): VectorPainter {
     val density = LocalDensity.current
-    val defaultSize = density.obtainSizePx(defaultWidth, defaultHeight)
-    val viewport = obtainViewportSize(defaultSize, viewportWidth, viewportHeight)
+    val widthPx = with(density) { defaultWidth.toPx() }
+    val heightPx = with(density) { defaultHeight.toPx() }
+
+    val vpWidth = if (viewportWidth.isNaN()) widthPx else viewportWidth
+    val vpHeight = if (viewportHeight.isNaN()) heightPx else viewportHeight
+
     val intrinsicColorFilter = remember(tintColor, tintBlendMode) {
-        createColorFilter(tintColor, tintBlendMode)
-    }
-    return remember { VectorPainter() }.apply {
-        configureVectorPainter(
-            defaultSize = defaultSize,
-            viewportSize = viewport,
-            name = name,
-            intrinsicColorFilter = intrinsicColorFilter,
-            autoMirror = autoMirror
-        )
-        val compositionContext = rememberCompositionContext()
-        this.composition = remember(viewportWidth, viewportHeight, content) {
-            val curComp = this.composition
-            val next = if (curComp == null || curComp.isDisposed) {
-                Composition(
-                    VectorApplier(this.vector.root),
-                    compositionContext
-                )
-            } else {
-                curComp
-            }
-            next.setContent {
-                content(viewport.width, viewport.height)
-            }
-            next
+        if (tintColor != Color.Unspecified) {
+            ColorFilter.tint(tintColor, tintBlendMode)
+        } else {
+            null
         }
     }
+
+    return remember { VectorPainter() }.apply {
+        // These assignments are thread safe as parameters are backed by a mutableState object
+        size = Size(widthPx, heightPx)
+        this.autoMirror = autoMirror
+        this.intrinsicColorFilter = intrinsicColorFilter
+        RenderVector(name, vpWidth, vpHeight, content)
+    }
 }
 
 /**
@@ -184,7 +175,7 @@
  * This can be represented by either a [ImageVector] or a programmatic
  * composition of a vector
  */
-class VectorPainter internal constructor(root: GroupComponent = GroupComponent()) : Painter() {
+class VectorPainter internal constructor() : Painter() {
 
     internal var size by mutableStateOf(Size.Zero)
 
@@ -199,19 +190,7 @@
             vector.intrinsicColorFilter = value
         }
 
-    internal var viewportSize: Size
-        get() = vector.viewportSize
-        set(value) {
-            vector.viewportSize = value
-        }
-
-    internal var name: String
-        get() = vector.name
-        set(value) {
-            vector.name = value
-        }
-
-    internal val vector = VectorComponent(root).apply {
+    private val vector = VectorComponent().apply {
         invalidateCallback = {
             if (drawCount == invalidateCount) {
                 invalidateCount++
@@ -222,11 +201,56 @@
     internal val bitmapConfig: ImageBitmapConfig
         get() = vector.cacheBitmapConfig
 
-    internal var composition: Composition? = null
+    private var composition: Composition? = null
+
+    @Suppress("PrimitiveInLambda")
+    private fun composeVector(
+        parent: CompositionContext,
+        composable: @Composable (viewportWidth: Float, viewportHeight: Float) -> Unit
+    ): Composition {
+        val existing = composition
+        val next = if (existing == null || existing.isDisposed) {
+            Composition(
+                VectorApplier(vector.root),
+                parent
+            )
+        } else {
+            existing
+        }
+        composition = next
+        next.setContent {
+            composable(vector.viewportSize.width, vector.viewportSize.height)
+        }
+        return next
+    }
 
     // TODO replace with mutableStateOf(Unit, neverEqualPolicy()) after b/291647821 is addressed
     private var invalidateCount by mutableIntStateOf(0)
 
+    @Suppress("PrimitiveInLambda")
+    @Composable
+    internal fun RenderVector(
+        name: String,
+        viewportWidth: Float,
+        viewportHeight: Float,
+        content: @Composable (viewportWidth: Float, viewportHeight: Float) -> Unit
+    ) {
+        vector.apply {
+            this.name = name
+            this.viewportSize = Size(viewportWidth, viewportHeight)
+        }
+        val composition = composeVector(
+            rememberCompositionContext(),
+            content
+        )
+
+        DisposableEffect(composition) {
+            onDispose {
+                composition.dispose()
+            }
+        }
+    }
+
     private var currentAlpha: Float = 1.0f
     private var currentColorFilter: ColorFilter? = null
 
@@ -302,117 +326,6 @@
     }
 }
 
-private fun Density.obtainSizePx(defaultWidth: Dp, defaultHeight: Dp) =
-        Size(defaultWidth.toPx(), defaultHeight.toPx())
-
-/**
- * Helper method to calculate the viewport size. If the viewport width/height are not specified
- * this falls back on the default size provided
- */
-private fun obtainViewportSize(
-    defaultSize: Size,
-    viewportWidth: Float,
-    viewportHeight: Float
-) = Size(
-        if (viewportWidth.isNaN()) defaultSize.width else viewportWidth,
-        if (viewportHeight.isNaN()) defaultSize.height else viewportHeight
-    )
-
-/**
- * Helper method to conditionally create a ColorFilter to tint contents if [tintColor] is
- * specified, that is [Color.isSpecified] returns true
- */
-private fun createColorFilter(tintColor: Color, tintBlendMode: BlendMode): ColorFilter? =
-    if (tintColor.isSpecified) {
-        ColorFilter.tint(tintColor, tintBlendMode)
-    } else {
-        null
-    }
-
-/**
- * Helper method to configure the properties of a VectorPainter that maybe re-used
- */
-internal fun VectorPainter.configureVectorPainter(
-    defaultSize: Size,
-    viewportSize: Size,
-    name: String = RootGroupName,
-    intrinsicColorFilter: ColorFilter?,
-    autoMirror: Boolean = false,
-): VectorPainter = apply {
-        this.size = defaultSize
-        this.autoMirror = autoMirror
-        this.intrinsicColorFilter = intrinsicColorFilter
-        this.viewportSize = viewportSize
-        this.name = name
-    }
-
-/**
- * Helper method to create a VectorPainter instance from an ImageVector
- */
-internal fun createVectorPainterFromImageVector(
-    density: Density,
-    imageVector: ImageVector,
-    root: GroupComponent
-): VectorPainter {
-    val defaultSize = density.obtainSizePx(imageVector.defaultWidth, imageVector.defaultHeight)
-    val viewport = obtainViewportSize(
-        defaultSize,
-        imageVector.viewportWidth,
-        imageVector.viewportHeight
-    )
-    return VectorPainter(root).configureVectorPainter(
-        defaultSize = defaultSize,
-        viewportSize = viewport,
-        name = imageVector.name,
-        intrinsicColorFilter = createColorFilter(imageVector.tintColor, imageVector.tintBlendMode),
-        autoMirror = imageVector.autoMirror
-    )
-}
-
-/**
- * statically create a a GroupComponent from the VectorGroup representation provided from
- * an [ImageVector] instance
- */
-internal fun GroupComponent.createGroupComponent(currentGroup: VectorGroup): GroupComponent {
-    for (index in 0 until currentGroup.size) {
-        val vectorNode = currentGroup[index]
-        if (vectorNode is VectorPath) {
-            val pathComponent = PathComponent().apply {
-                pathData = vectorNode.pathData
-                pathFillType = vectorNode.pathFillType
-                name = vectorNode.name
-                fill = vectorNode.fill
-                fillAlpha = vectorNode.fillAlpha
-                stroke = vectorNode.stroke
-                strokeAlpha = vectorNode.strokeAlpha
-                strokeLineWidth = vectorNode.strokeLineWidth
-                strokeLineCap = vectorNode.strokeLineCap
-                strokeLineJoin = vectorNode.strokeLineJoin
-                strokeLineMiter = vectorNode.strokeLineMiter
-                trimPathStart = vectorNode.trimPathStart
-                trimPathEnd = vectorNode.trimPathEnd
-                trimPathOffset = vectorNode.trimPathOffset
-            }
-            insertAt(index, pathComponent)
-        } else if (vectorNode is VectorGroup) {
-            val groupComponent = GroupComponent().apply {
-                name = vectorNode.name
-                rotation = vectorNode.rotation
-                scaleX = vectorNode.scaleX
-                scaleY = vectorNode.scaleY
-                translationX = vectorNode.translationX
-                translationY = vectorNode.translationY
-                pivotX = vectorNode.pivotX
-                pivotY = vectorNode.pivotY
-                clipPathData = vectorNode.clipPathData
-                createGroupComponent(vectorNode)
-            }
-            insertAt(index, groupComponent)
-        }
-    }
-    return this
-}
-
 /**
  * Recursively creates the vector graphic composition by traversing the tree structure.
  *
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt
new file mode 100644
index 0000000..417cfba
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.platform
+
+/**
+ * Represents a request to open a platform-specific text input session via
+ * `PlatformTextInputModifierNode.textInputSession`.
+ */
+expect interface PlatformTextInputMethodRequest
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputModifierNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputModifierNode.kt
index 76a866f..bd4133c 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputModifierNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/PlatformTextInputModifierNode.kt
@@ -23,21 +23,20 @@
 import androidx.compose.ui.node.DelegatableNode
 import androidx.compose.ui.node.requireLayoutNode
 import androidx.compose.ui.node.requireOwner
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.cancelAndJoin
 
 /**
  * A modifier node that can connect to the platform's text input IME system. To initiate a text
- * input session, call [textInputSession].
+ * input session, call [runTextInputSession].
  *
  * @sample androidx.compose.ui.samples.platformTextInputModifierNodeSample
  */
 interface PlatformTextInputModifierNode : DelegatableNode
 
 /**
- * Receiver type for [textInputSession].
+ * Receiver type for [runTextInputSession].
  */
 expect interface PlatformTextInputSession {
     /**
@@ -46,8 +45,8 @@
      * On platforms that support software keyboards, calling this method will show the keyboard and
      * attempt to keep it visible until the last session is closed.
      *
-     * Calling this method multiple times, within the same [textInputSession] block or from
-     * different [textInputSession]s, will restart the session each time.
+     * Calling this method multiple times, within the same [runTextInputSession] block or from
+     * different [runTextInputSession]s, will restart the session each time.
      *
      * @param request The platform-specific [PlatformTextInputMethodRequest] that will be used to
      * initiate the session.
@@ -57,7 +56,7 @@
 
 /**
  * A [PlatformTextInputSession] that is also a [CoroutineScope]. This type should _only_ be used as
- * the receiver of the function passed to [textInputSession]. Other extension functions that need
+ * the receiver of the function passed to [runTextInputSession]. Other extension functions that need
  * to get the scope should _not_ use this as their receiver type, instead they should be suspend
  * functions with a [PlatformTextInputSession] receiver. If they need a [CoroutineScope] they should
  * call the [kotlinx.coroutines.coroutineScope] function.
@@ -67,13 +66,13 @@
 /**
  * Starts a new text input session and suspends until the session is closed.
  *
- * The [session] function must call [PlatformTextInputSession.startInputMethod] to actually show and
+ * The [block] function must call [PlatformTextInputSession.startInputMethod] to actually show and
  * initiate the connection with the input method. If it does not, the session will end when this
  * function returns without showing the input method.
  *
  * If this function is called while another session is active, the sessions will not overlap. The
  * new session will interrupt the old one, which will be cancelled and allowed to finish running any
- * cancellation tasks (e.g. `finally` blocks) before running the new [session] function.
+ * cancellation tasks (e.g. `finally` blocks) before running the new [block] function.
  *
  * The session will be closed when:
  *  - The session function throws an exception.
@@ -88,24 +87,24 @@
  *
  * @sample androidx.compose.ui.samples.platformTextInputModifierNodeSample
  *
- * @param session A suspend function that will be called when the session is started and that must
+ * @param block A suspend function that will be called when the session is started and that must
  * call [PlatformTextInputSession.startInputMethod] to actually show and initiate the connection with
  * the input method.
  */
 @OptIn(InternalComposeUiApi::class)
-suspend fun PlatformTextInputModifierNode.textInputSession(
-    session: suspend PlatformTextInputSessionScope.() -> Nothing
+suspend fun PlatformTextInputModifierNode.runTextInputSession(
+    block: suspend PlatformTextInputSessionScope.() -> Nothing
 ): Nothing {
-    require(node.isAttached) { "textInputSession called from an unattached node" }
+    require(node.isAttached) { "runTextInputSession called from an unattached node" }
     val override = requireLayoutNode().compositionLocalMap[LocalPlatformTextInputMethodOverride]
     val handler = override ?: requireOwner()
-    handler.textInputSession(session)
+    handler.textInputSession(block)
 }
 
 /**
  * Composition local used to override the [PlatformTextInputSessionHandler] used by
- * [textInputSession] for tests. Should only be set by `PlatformTextInputMethodTestOverride` in the
- * ui-test module, and only ready by [textInputSession].
+ * [runTextInputSession] for tests. Should only be set by `PlatformTextInputMethodTestOverride` in
+ * the ui-test module, and only ready by [runTextInputSession].
  */
 @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -123,7 +122,7 @@
 interface PlatformTextInputSessionHandler {
     /**
      * Starts a new text input session and suspends until it's closed. For more information see
-     * [PlatformTextInputModifierNode.textInputSession].
+     * [PlatformTextInputModifierNode.runTextInputSession].
      *
      * Implementations must ensure that new requests cancel any active request. They must also
      * ensure that the previous request is finished running all cancellation tasks before starting
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextInputSession.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextInputSession.kt
index a874b46..9b95882 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextInputSession.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextInputSession.kt
@@ -18,7 +18,6 @@
 
 import androidx.compose.ui.InternalComposeUiApi
 import androidx.compose.ui.SessionMutex
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
 import java.awt.Component
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.suspendCancellableCoroutine
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt
new file mode 100644
index 0000000..c4db1d1
--- /dev/null
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformTextInputMethodRequest.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.platform
+
+import java.awt.Component
+import java.awt.event.InputMethodListener
+import java.awt.im.InputMethodRequests
+
+/**
+ * Represents a request to open a desktop text input session via
+ * `PlatformTextInputModifierNode.textInputSession`.
+ */
+actual interface PlatformTextInputMethodRequest {
+    /**
+     * The [InputMethodListener] that will be registered via [Component.addInputMethodListener]
+     * while the session is active.
+     */
+    val inputMethodListener: InputMethodListener
+
+    /**
+     * The [InputMethodRequests] that will be returned from the Compose host's
+     * [Component.getInputMethodRequests] while the session is active.
+     */
+    val inputMethodRequests: InputMethodRequests
+}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformTextInputSession.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformTextInputSession.desktop.kt
index f35320b..e5b8469 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformTextInputSession.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformTextInputSession.desktop.kt
@@ -16,8 +16,6 @@
 
 package androidx.compose.ui.platform
 
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
-
 actual interface PlatformTextInputSession {
     actual suspend fun startInputMethod(request: PlatformTextInputMethodRequest): Nothing
 }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopTextInputSessionTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopTextInputSessionTest.kt
index 24e4bc4..f0d005f 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopTextInputSessionTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopTextInputSessionTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.ui.platform
 
-import androidx.compose.ui.text.input.PlatformTextInputMethodRequest
 import androidx.compose.ui.unit.Density
 import com.google.common.truth.Truth.assertThat
 import java.awt.Frame
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
index 9dc6231..dff387b 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
@@ -31,9 +31,9 @@
 import androidx.compose.ui.autofill.AutofillTree
 import androidx.compose.ui.draganddrop.DragAndDropManager
 import androidx.compose.ui.focus.FocusDirection
-import androidx.compose.ui.focus.FocusDirection.Companion.In
+import androidx.compose.ui.focus.FocusDirection.Companion.Enter
+import androidx.compose.ui.focus.FocusDirection.Companion.Exit
 import androidx.compose.ui.focus.FocusDirection.Companion.Next
-import androidx.compose.ui.focus.FocusDirection.Companion.Out
 import androidx.compose.ui.focus.FocusDirection.Companion.Previous
 import androidx.compose.ui.focus.FocusOwner
 import androidx.compose.ui.focus.FocusOwnerImpl
@@ -388,8 +388,8 @@
     override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
         return when (keyEvent.key) {
             Tab -> if (keyEvent.isShiftPressed) Previous else Next
-            DirectionCenter -> In
-            Back -> Out
+            DirectionCenter -> Enter
+            Back -> Exit
             else -> null
         }
     }
diff --git a/concurrent/concurrent-futures/api/api_lint.ignore b/concurrent/concurrent-futures/api/api_lint.ignore
index faa2f5c..e13d6a3 100644
--- a/concurrent/concurrent-futures/api/api_lint.ignore
+++ b/concurrent/concurrent-futures/api/api_lint.ignore
@@ -8,7 +8,7 @@
 
 
 NotCloseable: androidx.concurrent.futures.CallbackToFutureAdapter.Completer:
-    Classes that release resources (finalize()) should implement AutoClosable and CloseGuard: class androidx.concurrent.futures.CallbackToFutureAdapter.Completer
+    Classes that release resources (finalize()) should implement AutoCloseable and CloseGuard: class androidx.concurrent.futures.CallbackToFutureAdapter.Completer
 
 
 PairedRegistration: androidx.concurrent.futures.CallbackToFutureAdapter.Completer#addCancellationListener(Runnable, java.util.concurrent.Executor):
diff --git a/concurrent/concurrent-futures/lint-baseline.xml b/concurrent/concurrent-futures/lint-baseline.xml
index 3757244..7d10429 100644
--- a/concurrent/concurrent-futures/lint-baseline.xml
+++ b/concurrent/concurrent-futures/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-beta03" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanSynchronizedMethods"
@@ -11,15 +11,6 @@
     </issue>
 
     <issue
-        id="BanThreadSleep"
-        message="Uses Thread.sleep()"
-        errorLine1="        Thread.sleep(toWaitMillis);"
-        errorLine2="               ~~~~~">
-        <location
-            file="src/test/java/androidx/concurrent/futures/AbstractResolvableFutureTest.java"/>
-    </issue>
-
-    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public final void addListener(Runnable listener, Executor executor) {"
diff --git a/constraintlayout/constraintlayout-compose/api/api_lint.ignore b/constraintlayout/constraintlayout-compose/api/api_lint.ignore
index 71cc70d..5b29013 100644
--- a/constraintlayout/constraintlayout-compose/api/api_lint.ignore
+++ b/constraintlayout/constraintlayout-compose/api/api_lint.ignore
@@ -11,13 +11,3 @@
     Invalid name for boolean property `showKeyPositions`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field DebugFlags.showPaths:
     Invalid name for boolean property `showPaths`. Should start with one of `has`, `can`, `should`, `is`.
-
-
-KotlinDefaultParameterOrder: androidx.constraintlayout.compose.MotionLayoutKt#MotionLayout(androidx.constraintlayout.compose.ConstraintSet, androidx.constraintlayout.compose.ConstraintSet, androidx.compose.ui.Modifier, androidx.constraintlayout.compose.Transition, float, int, androidx.constraintlayout.compose.LayoutInformationReceiver, int, kotlin.jvm.functions.Function1<? super androidx.constraintlayout.compose.MotionLayoutScope,kotlin.Unit>) parameter #2:
-    Parameter `modifier` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
-KotlinDefaultParameterOrder: androidx.constraintlayout.compose.MotionLayoutKt#MotionLayout(androidx.constraintlayout.compose.ConstraintSet, androidx.constraintlayout.compose.ConstraintSet, androidx.compose.ui.Modifier, androidx.constraintlayout.compose.Transition, float, int, androidx.constraintlayout.compose.LayoutInformationReceiver, int, kotlin.jvm.functions.Function1<? super androidx.constraintlayout.compose.MotionLayoutScope,kotlin.Unit>) parameter #3:
-    Parameter `transition` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
-KotlinDefaultParameterOrder: androidx.constraintlayout.compose.MotionLayoutKt#MotionLayout(androidx.constraintlayout.compose.ConstraintSet, androidx.constraintlayout.compose.ConstraintSet, androidx.compose.ui.Modifier, androidx.constraintlayout.compose.Transition, float, int, int, kotlin.jvm.functions.Function1<? super androidx.constraintlayout.compose.MotionLayoutScope,kotlin.Unit>) parameter #2:
-    Parameter `modifier` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
-KotlinDefaultParameterOrder: androidx.constraintlayout.compose.MotionLayoutKt#MotionLayout(androidx.constraintlayout.compose.ConstraintSet, androidx.constraintlayout.compose.ConstraintSet, androidx.compose.ui.Modifier, androidx.constraintlayout.compose.Transition, float, int, int, kotlin.jvm.functions.Function1<? super androidx.constraintlayout.compose.MotionLayoutScope,kotlin.Unit>) parameter #3:
-    Parameter `transition` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
diff --git a/constraintlayout/constraintlayout-core/api/api_lint.ignore b/constraintlayout/constraintlayout-core/api/api_lint.ignore
index 0f5c412..e0d0141 100644
--- a/constraintlayout/constraintlayout-core/api/api_lint.ignore
+++ b/constraintlayout/constraintlayout-core/api/api_lint.ignore
@@ -2219,8 +2219,6 @@
     Missing nullability on method `allocate` return
 MissingNullability: androidx.constraintlayout.core.parser.CLContainer#allocate(char[]) parameter #0:
     Missing nullability on parameter `content` in method `allocate`
-MissingNullability: androidx.constraintlayout.core.parser.CLContainer#clone():
-    Missing nullability on method `clone` return
 MissingNullability: androidx.constraintlayout.core.parser.CLContainer#get(String):
     Missing nullability on method `get` return
 MissingNullability: androidx.constraintlayout.core.parser.CLContainer#get(String) parameter #0:
@@ -2297,8 +2295,6 @@
     Missing nullability on parameter `content` in method `CLElement`
 MissingNullability: androidx.constraintlayout.core.parser.CLElement#addIndent(StringBuilder, int) parameter #0:
     Missing nullability on parameter `builder` in method `addIndent`
-MissingNullability: androidx.constraintlayout.core.parser.CLElement#clone():
-    Missing nullability on method `clone` return
 MissingNullability: androidx.constraintlayout.core.parser.CLElement#content():
     Missing nullability on method `content` return
 MissingNullability: androidx.constraintlayout.core.parser.CLElement#getContainer():
@@ -2353,8 +2349,6 @@
     Missing nullability on method `allocate` return
 MissingNullability: androidx.constraintlayout.core.parser.CLObject#allocate(char[]) parameter #0:
     Missing nullability on parameter `content` in method `allocate`
-MissingNullability: androidx.constraintlayout.core.parser.CLObject#clone():
-    Missing nullability on method `clone` return
 MissingNullability: androidx.constraintlayout.core.parser.CLObject#iterator():
     Missing nullability on method `iterator` return
 MissingNullability: androidx.constraintlayout.core.parser.CLObject#toFormattedJSON():
@@ -3059,12 +3053,6 @@
     Missing nullability on parameter `widgetState` in method `setPathRelative`
 MissingNullability: androidx.constraintlayout.core.state.Transition.WidgetState#update(androidx.constraintlayout.core.widgets.ConstraintWidget, int) parameter #0:
     Missing nullability on parameter `child` in method `update`
-MissingNullability: androidx.constraintlayout.core.state.TransitionParser#parse(androidx.constraintlayout.core.parser.CLObject, androidx.constraintlayout.core.state.Transition, androidx.constraintlayout.core.state.CorePixelDp) parameter #0:
-    Missing nullability on parameter `json` in method `parse`
-MissingNullability: androidx.constraintlayout.core.state.TransitionParser#parse(androidx.constraintlayout.core.parser.CLObject, androidx.constraintlayout.core.state.Transition, androidx.constraintlayout.core.state.CorePixelDp) parameter #1:
-    Missing nullability on parameter `transition` in method `parse`
-MissingNullability: androidx.constraintlayout.core.state.TransitionParser#parse(androidx.constraintlayout.core.parser.CLObject, androidx.constraintlayout.core.state.Transition, androidx.constraintlayout.core.state.CorePixelDp) parameter #2:
-    Missing nullability on parameter `dpToPixel` in method `parse`
 MissingNullability: androidx.constraintlayout.core.state.TransitionParser#parseKeyFrames(androidx.constraintlayout.core.parser.CLObject, androidx.constraintlayout.core.state.Transition) parameter #0:
     Missing nullability on parameter `transitionCLObject` in method `parseKeyFrames`
 MissingNullability: androidx.constraintlayout.core.state.TransitionParser#parseKeyFrames(androidx.constraintlayout.core.parser.CLObject, androidx.constraintlayout.core.state.Transition) parameter #1:
diff --git a/constraintlayout/constraintlayout/api/api_lint.ignore b/constraintlayout/constraintlayout/api/api_lint.ignore
index 422e6ca..85dff48e 100644
--- a/constraintlayout/constraintlayout/api/api_lint.ignore
+++ b/constraintlayout/constraintlayout/api/api_lint.ignore
@@ -331,8 +331,6 @@
     Missing nullability on method `getSpans` return
 MissingNullability: androidx.constraintlayout.helper.widget.Grid#init(android.util.AttributeSet) parameter #0:
     Missing nullability on parameter `attrs` in method `init`
-MissingNullability: androidx.constraintlayout.helper.widget.Grid#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.constraintlayout.helper.widget.Grid#setColumnWeights(String) parameter #0:
     Missing nullability on parameter `columnWeights` in method `setColumnWeights`
 MissingNullability: androidx.constraintlayout.helper.widget.Grid#setRowWeights(String) parameter #0:
@@ -1073,8 +1071,6 @@
     Missing nullability on parameter `context` in method `ImageFilterButton`
 MissingNullability: androidx.constraintlayout.utils.widget.ImageFilterButton#ImageFilterButton(android.content.Context, android.util.AttributeSet, int) parameter #1:
     Missing nullability on parameter `attrs` in method `ImageFilterButton`
-MissingNullability: androidx.constraintlayout.utils.widget.ImageFilterButton#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.constraintlayout.utils.widget.ImageFilterButton#setImageDrawable(android.graphics.drawable.Drawable) parameter #0:
     Missing nullability on parameter `drawable` in method `setImageDrawable`
 MissingNullability: androidx.constraintlayout.utils.widget.ImageFilterView#ImageFilterView(android.content.Context) parameter #0:
@@ -1087,8 +1083,6 @@
     Missing nullability on parameter `context` in method `ImageFilterView`
 MissingNullability: androidx.constraintlayout.utils.widget.ImageFilterView#ImageFilterView(android.content.Context, android.util.AttributeSet, int) parameter #1:
     Missing nullability on parameter `attrs` in method `ImageFilterView`
-MissingNullability: androidx.constraintlayout.utils.widget.ImageFilterView#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.constraintlayout.utils.widget.ImageFilterView#setAltImageDrawable(android.graphics.drawable.Drawable) parameter #0:
     Missing nullability on parameter `altDrawable` in method `setAltImageDrawable`
 MissingNullability: androidx.constraintlayout.utils.widget.ImageFilterView#setImageDrawable(android.graphics.drawable.Drawable) parameter #0:
@@ -1105,8 +1099,6 @@
     Missing nullability on parameter `attrs` in method `MockView`
 MissingNullability: androidx.constraintlayout.utils.widget.MockView#mText:
     Missing nullability on field `mText` in class `class androidx.constraintlayout.utils.widget.MockView`
-MissingNullability: androidx.constraintlayout.utils.widget.MockView#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionButton#MotionButton(android.content.Context) parameter #0:
     Missing nullability on parameter `context` in method `MotionButton`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionButton#MotionButton(android.content.Context, android.util.AttributeSet) parameter #0:
@@ -1117,8 +1109,6 @@
     Missing nullability on parameter `context` in method `MotionButton`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionButton#MotionButton(android.content.Context, android.util.AttributeSet, int) parameter #1:
     Missing nullability on parameter `attrs` in method `MotionButton`
-MissingNullability: androidx.constraintlayout.utils.widget.MotionButton#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionLabel#MotionLabel(android.content.Context) parameter #0:
     Missing nullability on parameter `context` in method `MotionLabel`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionLabel#MotionLabel(android.content.Context, android.util.AttributeSet) parameter #0:
@@ -1127,8 +1117,6 @@
     Missing nullability on parameter `context` in method `MotionLabel`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionLabel#getTypeface():
     Missing nullability on method `getTypeface` return
-MissingNullability: androidx.constraintlayout.utils.widget.MotionLabel#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionLabel#setText(CharSequence) parameter #0:
     Missing nullability on parameter `text` in method `setText`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionLabel#setTypeface(android.graphics.Typeface) parameter #0:
@@ -1143,8 +1131,6 @@
     Missing nullability on parameter `context` in method `MotionTelltales`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionTelltales#MotionTelltales(android.content.Context, android.util.AttributeSet, int) parameter #1:
     Missing nullability on parameter `attrs` in method `MotionTelltales`
-MissingNullability: androidx.constraintlayout.utils.widget.MotionTelltales#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.constraintlayout.utils.widget.MotionTelltales#setText(CharSequence) parameter #0:
     Missing nullability on parameter `text` in method `setText`
 MissingNullability: androidx.constraintlayout.widget.Barrier#Barrier(android.content.Context) parameter #0:
@@ -1263,8 +1249,6 @@
     Missing nullability on field `mReferenceTags` in class `class androidx.constraintlayout.widget.ConstraintHelper`
 MissingNullability: androidx.constraintlayout.widget.ConstraintHelper#myContext:
     Missing nullability on field `myContext` in class `class androidx.constraintlayout.widget.ConstraintHelper`
-MissingNullability: androidx.constraintlayout.widget.ConstraintHelper#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.constraintlayout.widget.ConstraintHelper#removeView(android.view.View) parameter #0:
     Missing nullability on parameter `view` in method `removeView`
 MissingNullability: androidx.constraintlayout.widget.ConstraintHelper#resolveRtl(androidx.constraintlayout.core.widgets.ConstraintWidget, boolean) parameter #0:
@@ -1711,8 +1695,6 @@
     Missing nullability on parameter `context` in method `Guideline`
 MissingNullability: androidx.constraintlayout.widget.Guideline#Guideline(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
     Missing nullability on parameter `attrs` in method `Guideline`
-MissingNullability: androidx.constraintlayout.widget.Guideline#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.constraintlayout.widget.Placeholder#Placeholder(android.content.Context) parameter #0:
     Missing nullability on parameter `context` in method `Placeholder`
 MissingNullability: androidx.constraintlayout.widget.Placeholder#Placeholder(android.content.Context, android.util.AttributeSet) parameter #0:
@@ -1729,8 +1711,6 @@
     Missing nullability on parameter `attrs` in method `Placeholder`
 MissingNullability: androidx.constraintlayout.widget.Placeholder#getContent():
     Missing nullability on method `getContent` return
-MissingNullability: androidx.constraintlayout.widget.Placeholder#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.constraintlayout.widget.Placeholder#updatePostMeasure(androidx.constraintlayout.widget.ConstraintLayout) parameter #0:
     Missing nullability on parameter `container` in method `updatePostMeasure`
 MissingNullability: androidx.constraintlayout.widget.Placeholder#updatePreLayout(androidx.constraintlayout.widget.ConstraintLayout) parameter #0:
@@ -1749,8 +1729,6 @@
     Missing nullability on parameter `context` in method `ReactiveGuide`
 MissingNullability: androidx.constraintlayout.widget.ReactiveGuide#ReactiveGuide(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
     Missing nullability on parameter `attrs` in method `ReactiveGuide`
-MissingNullability: androidx.constraintlayout.widget.ReactiveGuide#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.constraintlayout.widget.SharedValues#addListener(int, androidx.constraintlayout.widget.SharedValues.SharedValuesListener) parameter #1:
     Missing nullability on parameter `listener` in method `addListener`
 MissingNullability: androidx.constraintlayout.widget.SharedValues#removeListener(androidx.constraintlayout.widget.SharedValues.SharedValuesListener) parameter #0:
diff --git a/constraintlayout/constraintlayout/build.gradle b/constraintlayout/constraintlayout/build.gradle
index 2dd7a27..9a4f6cc 100644
--- a/constraintlayout/constraintlayout/build.gradle
+++ b/constraintlayout/constraintlayout/build.gradle
@@ -32,24 +32,7 @@
 
 }
 
-def latestSdkVersion = 31
-
 android {
-    defaultConfig {
-        minSdkVersion 14
-        targetSdkVersion latestSdkVersion
-        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_8
-        targetCompatibility JavaVersion.VERSION_1_8
-    }
-
-    buildFeatures {
-        buildConfig = false
-    }
-
     namespace "androidx.constraintlayout.widget"
 }
 
diff --git a/constraintlayout/constraintlayout/lint-baseline.xml b/constraintlayout/constraintlayout/lint-baseline.xml
index 03b1210..70b5c26 100644
--- a/constraintlayout/constraintlayout/lint-baseline.xml
+++ b/constraintlayout/constraintlayout/lint-baseline.xml
@@ -1,41 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.1.0" type="baseline" client="gradle" dependencies="false" name="AGP (8.1.0)" variant="all" version="8.1.0">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `android.view.ViewGroup.MarginLayoutParams#setMarginStart`"
-        errorLine1="                mParams.setMarginStart(mParams.UNSET);"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `android.view.ViewGroup.MarginLayoutParams#setMarginEnd`"
-        errorLine1="                mParams.setMarginEnd(mParams.UNSET);"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `android.view.ViewGroup.MarginLayoutParams#setMarginStart`"
-        errorLine1="                mParams.setMarginStart(value);"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `android.view.ViewGroup.MarginLayoutParams#setMarginEnd`"
-        errorLine1="                mParams.setMarginEnd(value);"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanTargetApiAnnotation"
@@ -327,96 +291,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintLayout is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            int paddingStart = Math.max(0, getPaddingStart());"
-        errorLine2="                                           ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintLayout is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            int paddingEnd = Math.max(0, getPaddingEnd());"
-        errorLine2="                                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintLayout is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return isRtlSupported &amp;&amp; (View.LAYOUT_DIRECTION_RTL == getLayoutDirection());"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintLayout is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            rtlPadding = Math.max(0, getPaddingStart()) + Math.max(0, getPaddingEnd());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintLayout is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            rtlPadding = Math.max(0, getPaddingStart()) + Math.max(0, getPaddingEnd());"
-        errorLine2="                                                                      ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintLayout.LayoutParams is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                isRtl = (View.LAYOUT_DIRECTION_RTL == getLayoutDirection());"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintProperties is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mParams.setMarginStart(mParams.UNSET);"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintProperties is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mParams.setMarginEnd(mParams.UNSET);"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintProperties is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mParams.setMarginStart(value);"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintProperties is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mParams.setMarginEnd(value);"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.constraintlayout.widget.ConstraintProperties is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mView.setElevation(elevation);"
         errorLine2="                  ~~~~~~~~~~~~">
@@ -435,24 +309,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintProperties is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    mParams.setMarginStart(margin);"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintProperties is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    mParams.setMarginEnd(margin);"
-        errorLine2="                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.constraintlayout.widget.ConstraintSet is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        constraint.transform.translationZ = view.getTranslationZ();"
         errorLine2="                                                                 ~~~~~~~~~~~~~~~">
@@ -471,42 +327,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintSet.Constraint is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                layout.endMargin = param.getMarginEnd();"
-        errorLine2="                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintSet.Constraint is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                layout.startMargin = param.getMarginStart();"
-        errorLine2="                                           ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintSet.Constraint is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                param.setMarginStart(layout.startMargin);"
-        errorLine2="                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.widget.ConstraintSet.Constraint is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                param.setMarginEnd(layout.endMargin);"
-        errorLine2="                      ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.constraintlayout.widget.ConstraintSet is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    constraint.transform.translationZ = view.getTranslationZ();"
         errorLine2="                                                             ~~~~~~~~~~~~~~~">
@@ -543,15 +363,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.helper.widget.Grid is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            v.setId(View.generateViewId());"
-        errorLine2="                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/helper/widget/Grid.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            outline.setRoundRect(0, 0, w, h, r);"
         errorLine2="                                    ~~~~~~~~~~~~">
@@ -957,33 +768,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.motion.widget.MotionLayout is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                            Display display = getDisplay();"
-        errorLine2="                                              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.motion.widget.MotionLayout is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        int currentRotation = getDisplay().getRotation();"
-        errorLine2="                              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.motion.widget.MotionLayout.Model is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    layoutParams.resolveLayoutDirection(getLayoutDirection());"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.constraintlayout.motion.widget.MotionLayout is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    target.setNestedScrollingEnabled(false);"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1002,15 +786,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.constraintlayout.motion.widget.MotionLayout is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            Display display = getDisplay();"
-        errorLine2="                              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.constraintlayout.motion.utils.ViewOscillator.ElevationSet is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                view.setElevation(get(t));"
         errorLine2="                     ~~~~~~~~~~~~">
@@ -1118,6 +893,285 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/Barrier.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/helper/widget/Carousel.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintProperties.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                        if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                        if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/widget/ConstraintSet.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/helper/widget/Flow.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/helper/widget/Flow.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/helper/widget/Grid.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="                if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.KITKAT || isAttachedToWindow()) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/constraintlayout/motion/widget/MotionLayout.java"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="The getter return type (`String[]`) and setter parameter type (`String`) getter and setter methods for property `stateLabels` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public String[] getStateLabels() {"
diff --git a/contentpager/contentpager/lint-baseline.xml b/contentpager/contentpager/lint-baseline.xml
index de601d0..2e1fb98 100644
--- a/contentpager/contentpager/lint-baseline.xml
+++ b/contentpager/contentpager/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `android.database.AbstractCursor#setExtras`"
+        message="Call requires API level 23 (current min is 19): `android.database.AbstractCursor#setExtras`"
         errorLine1="        c.setExtras(extras);"
         errorLine2="          ~~~~~~~~~">
         <location
@@ -12,16 +12,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 15 (current min is 14): `new android.database.CursorWindow`"
-        errorLine1="            setWindow(new CursorWindow(&quot;stevie&quot;));"
-        errorLine2="                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/contentpager/content/TestContentProvider.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 14): `android.database.AbstractCursor#setExtras`"
+        message="Call requires API level 23 (current min is 19): `android.database.AbstractCursor#setExtras`"
         errorLine1="        cursor.setExtras(extras);"
         errorLine2="               ~~~~~~~~~">
         <location
@@ -47,28 +38,19 @@
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.contentpager.content.Query is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return resolver.query("
-        errorLine2="                            ~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/contentpager/content/Query.java"/>
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.contentpager.content.Query is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            if (mCancellationSignal != null &amp;&amp; !mCancellationSignal.isCanceled()) {"
-        errorLine2="                                                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/contentpager/content/Query.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.contentpager.content.Query is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mCancellationSignal.cancel();"
-        errorLine2="                                    ~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/contentpager/content/Query.java"/>
     </issue>
diff --git a/coordinatorlayout/coordinatorlayout/api/api_lint.ignore b/coordinatorlayout/coordinatorlayout/api/api_lint.ignore
index 06d3c6e..968f68f 100644
--- a/coordinatorlayout/coordinatorlayout/api/api_lint.ignore
+++ b/coordinatorlayout/coordinatorlayout/api/api_lint.ignore
@@ -33,8 +33,6 @@
     Missing nullability on method `generateLayoutParams` return
 MissingNullability: androidx.coordinatorlayout.widget.CoordinatorLayout#generateLayoutParams(android.view.ViewGroup.LayoutParams) parameter #0:
     Missing nullability on parameter `p` in method `generateLayoutParams`
-MissingNullability: androidx.coordinatorlayout.widget.CoordinatorLayout#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `c` in method `onDraw`
 MissingNullability: androidx.coordinatorlayout.widget.CoordinatorLayout#onInterceptTouchEvent(android.view.MotionEvent) parameter #0:
     Missing nullability on parameter `ev` in method `onInterceptTouchEvent`
 MissingNullability: androidx.coordinatorlayout.widget.CoordinatorLayout#onNestedFling(android.view.View, float, float, boolean) parameter #0:
diff --git a/core/core-animation/lint-baseline.xml b/core/core-animation/lint-baseline.xml
index d3b9273..ee39c90 100644
--- a/core/core-animation/lint-baseline.xml
+++ b/core/core-animation/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="ResourceType"
@@ -308,6 +308,24 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/animation/AnimationHandler.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/animation/AnimationHandler.java"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="The getter return type (`PropertyValuesHolder[]`) and setter parameter type (`PropertyValuesHolder...`) getter and setter methods for property `values` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public PropertyValuesHolder[] getValues() {"
diff --git a/core/core-graphics-integration-tests/testapp/build.gradle b/core/core-graphics-integration-tests/testapp/build.gradle
index 768d7b4..7007b32 100644
--- a/core/core-graphics-integration-tests/testapp/build.gradle
+++ b/core/core-graphics-integration-tests/testapp/build.gradle
@@ -14,10 +14,6 @@
  * limitations under the License.
  */
 
-
-//import androidx.build.LibraryType
-//import androidx.build.LibraryGroups
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -27,7 +23,6 @@
 android {
     defaultConfig {
         applicationId "androidx.core.graphics.sample"
-        minSdkVersion 17
     }
     namespace "androidx.core.graphics.sample"
 }
diff --git a/core/core-graphics-integration-tests/testapp/lint-baseline.xml b/core/core-graphics-integration-tests/testapp/lint-baseline.xml
new file mode 100644
index 0000000..456d9b8
--- /dev/null
+++ b/core/core-graphics-integration-tests/testapp/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/sample/GraphicsSampleActivity.kt"/>
+    </issue>
+
+</issues>
diff --git a/core/core-ktx/lint-baseline.xml b/core/core-ktx/lint-baseline.xml
new file mode 100644
index 0000000..0df70ca
--- /dev/null
+++ b/core/core-ktx/lint-baseline.xml
@@ -0,0 +1,517 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/animation/Animator.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/animation/Animator.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/animation/Animator.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/animation/Animator.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/AtomicFile.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/AtomicFile.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/AtomicFile.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/AtomicFile.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/AtomicFile.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= 18 &amp;&amp; value is IBinder) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/Bundle.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/Bundle.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/Locale.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@get:RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/LongSparseArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/Path.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/Path.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/Path.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/Path.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/Path.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@get:RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/SparseLongArray.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/transition/Transition.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/transition/Transition.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/transition/Transition.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/transition/Transition.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/transition/Transition.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/transition/Transition.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/View.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/View.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/View.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroup.kt"/>
+    </issue>
+
+</issues>
diff --git a/core/core-location-altitude/lint-baseline.xml b/core/core-location-altitude/lint-baseline.xml
deleted file mode 100644
index 034c3b4..0000000
--- a/core/core-location-altitude/lint-baseline.xml
+++ /dev/null
@@ -1,301 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        int sizeIj = 1 &lt;&lt; (S2CellIdUtils.MAX_LEVEL - params.getMapS2Level());"
-        errorLine2="                                                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/AltitudeConverter.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        long z11 = S2CellIdUtils.getParent(s2CellId, params.getMapS2Level());"
-        errorLine2="                                                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/AltitudeConverter.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                            params.getMapS2Level()),"
-        errorLine2="                                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/AltitudeConverter.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                            params.getMapS2Level()),"
-        errorLine2="                                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/AltitudeConverter.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                            params.getMapS2Level())"
-        errorLine2="                                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/AltitudeConverter.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        double sizeIj = 1 &lt;&lt; (S2CellIdUtils.MAX_LEVEL - params.getMapS2Level());"
-        errorLine2="                                                               ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/AltitudeConverter.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getModelRmseMeters can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                        (float) Math.hypot(verticalAccuracyMeters, params.getModelRmseMeters()));"
-        errorLine2="                                                                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/AltitudeConverter.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getCacheTileS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        return S2CellIdUtils.getParent(s2CellId, params.getCacheTileS2Level());"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getDiskTileS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                S2CellIdUtils.getParent(s2CellId, params.getDiskTileS2Level()));"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="S2TileProto.getByteBuffer can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        ByteString byteString = tiles[tileIndex].getByteBuffer();"
-        errorLine2="                                                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="ByteString.isEmpty can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        if (byteString.isEmpty()) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="ByteString.asReadOnlyByteBuffer can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        ByteBuffer byteBuffer = byteString.asReadOnlyByteBuffer();"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                params.getMapS2Level() - Integer.numberOfTrailingZeros(byteBuffer.limit()) / 2;"
-        errorLine2="                       ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="            int numBitsRightOfMap = 2 * (S2CellIdUtils.MAX_LEVEL - params.getMapS2Level()) + 1;"
-        errorLine2="                                                                          ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="S2TileProto.getByteJpeg can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        mergeByteImageValues(params, tiles[tileIndex].getByteJpeg(), s2CellIds, tiles, tileIndex,"
-        errorLine2="                                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="S2TileProto.getBytePng can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        mergeByteImageValues(params, tiles[tileIndex].getBytePng(), s2CellIds, tiles, tileIndex,"
-        errorLine2="                                                      ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="ByteString.isEmpty can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        if (byteString.isEmpty()) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="ByteString.newInput can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        try (InputStream inputStream = byteString.newInput()) {"
-        errorLine2="                                                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        return (iOrJ >> (S2CellIdUtils.MAX_LEVEL - params.getMapS2Level())) % widthOrHeight;"
-        errorLine2="                                                          ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="            Preconditions.checkArgument(S2CellIdUtils.getLevel(s2CellId) == params.getMapS2Level());"
-        errorLine2="                                                                                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getModelAMeters can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="            heightsMeters[i] *= params.getModelAMeters();"
-        errorLine2="                                       ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getModelBMeters can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="            heightsMeters[i] += params.getModelBMeters();"
-        errorLine2="                                       ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getCacheTileS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                1 &lt;&lt; (2 * (params.getMapS2Level() - params.getCacheTileS2Level()));"
-        errorLine2="                                                           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                1 &lt;&lt; (2 * (params.getMapS2Level() - params.getCacheTileS2Level()));"
-        errorLine2="                                  ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.getMapS2Level can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="            long s2CellId = S2CellIdUtils.getTraversalStart(cacheKeys[i], params.getMapS2Level());"
-        errorLine2="                                                                                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="Builder.build can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                    S2TileProto.newBuilder().setByteBuffer(ByteString.copyFrom(bytes)).build();"
-        errorLine2="                                                                                       ~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="Builder.setByteBuffer can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                    S2TileProto.newBuilder().setByteBuffer(ByteString.copyFrom(bytes)).build();"
-        errorLine2="                                             ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="ByteString.copyFrom can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                    S2TileProto.newBuilder().setByteBuffer(ByteString.copyFrom(bytes)).build();"
-        errorLine2="                                                                      ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="S2TileProto.newBuilder can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="                    S2TileProto.newBuilder().setByteBuffer(ByteString.copyFrom(bytes)).build();"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/GeoidHeightMap.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="AbstractMessageLite.toByteArray can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        return value.toByteArray();"
-        errorLine2="                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/db/MapParamsEntity.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="MapParamsProto.parseFrom can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="            return MapParamsProto.parseFrom(byteArray);"
-        errorLine2="                                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/db/MapParamsEntity.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="AbstractMessageLite.toByteArray can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="        return tile.toByteArray();"
-        errorLine2="                    ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/db/TilesEntity.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="S2TileProto.parseFrom can only be called from within the same library (missing Maven coordinate due to repackaging)"
-        errorLine1="            return S2TileProto.parseFrom(byteArray);"
-        errorLine2="                               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/altitude/impl/db/TilesEntity.java"/>
-    </issue>
-
-</issues>
diff --git a/core/core-remoteviews/lint-baseline.xml b/core/core-remoteviews/lint-baseline.xml
new file mode 100644
index 0000000..959235b
--- /dev/null
+++ b/core/core-remoteviews/lint-baseline.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        SDK_INT >= 16 -> {"
+        errorLine2="        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/AppWidgetManagerCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        SDK_INT >= 16 -> {"
+        errorLine2="        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/AppWidgetManagerCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/AppWidgetManagerCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        val methodName = if (Build.VERSION.SDK_INT >= 16) &quot;setImageAlpha&quot; else &quot;setAlpha&quot;"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/RemoteViewsCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/RemoteViewsCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/RemoteViewsCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/RemoteViewsCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/RemoteViewsCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/RemoteViewsCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/RemoteViewsCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/RemoteViewsCompat.kt"/>
+    </issue>
+
+</issues>
diff --git a/core/core-remoteviews/src/test/java/androidx/core/widget/AppWidgetManagerCompatTest.kt b/core/core-remoteviews/src/test/java/androidx/core/widget/AppWidgetManagerCompatTest.kt
index c190fbb..4c36b25 100644
--- a/core/core-remoteviews/src/test/java/androidx/core/widget/AppWidgetManagerCompatTest.kt
+++ b/core/core-remoteviews/src/test/java/androidx/core/widget/AppWidgetManagerCompatTest.kt
@@ -48,8 +48,7 @@
 
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
-@Config(sdk = [17])
-@RequiresApi(17)
+@Config(sdk = [19])
 class AppWidgetManagerCompatTest {
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
diff --git a/core/core-remoteviews/src/test/java/androidx/core/widget/RemoteViewsTest.kt b/core/core-remoteviews/src/test/java/androidx/core/widget/RemoteViewsTest.kt
index 0a38a01..bf57523 100644
--- a/core/core-remoteviews/src/test/java/androidx/core/widget/RemoteViewsTest.kt
+++ b/core/core-remoteviews/src/test/java/androidx/core/widget/RemoteViewsTest.kt
@@ -49,7 +49,6 @@
 
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
-@Config(minSdk = 14)
 class RemoteViewsTest {
     private val mContext = ApplicationProvider.getApplicationContext<Context>()
     private lateinit var mRemoteViews: RemoteViews
@@ -96,8 +95,6 @@
         assertThat(mTextView.error).isNull()
     }
 
-    @Config(minSdk = 16)
-    @SdkSuppress(minSdkVersion = 16)
     @Test
     fun setTextViewMaxLines() {
         mRemoteViews.setTextViewMaxLines(R.id.text, 7)
diff --git a/core/core-remoteviews/src/test/resources/robolectric.properties b/core/core-remoteviews/src/test/resources/robolectric.properties
new file mode 100644
index 0000000..69fde47
--- /dev/null
+++ b/core/core-remoteviews/src/test/resources/robolectric.properties
@@ -0,0 +1,3 @@
+# robolectric properties
+# Temporary until we update Robolectric to support API level 34.
+sdk=33
diff --git a/core/core-telecom/api/api_lint.ignore b/core/core-telecom/api/api_lint.ignore
new file mode 100644
index 0000000..2bf73e4
--- /dev/null
+++ b/core/core-telecom/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+NotCloseable: androidx.core.telecom.CallControlScope:
+    Classes that release resources (disconnect()) should implement AutoCloseable and CloseGuard: class androidx.core.telecom.CallControlScope
diff --git a/core/core-telecom/src/main/java/androidx/core/telecom/CallControlScope.kt b/core/core-telecom/src/main/java/androidx/core/telecom/CallControlScope.kt
index ebfd735..5e6f8f0 100644
--- a/core/core-telecom/src/main/java/androidx/core/telecom/CallControlScope.kt
+++ b/core/core-telecom/src/main/java/androidx/core/telecom/CallControlScope.kt
@@ -39,9 +39,22 @@
  *             // update UI
  *           }
  *
- *           // Collect updates
- *           currentCallEndpoint.collect { // access the new [CallEndpoint] here }
- *     }
+ *          // Collect updates
+ *          launch {
+ *             currentCallEndpoint.collect { // access the new [CallEndpoint] here }
+ *          }
+ *
+ *          launch {
+ *             availableEndpoints.collect { // access the available [CallEndpoint]s here }
+ *          }
+ *
+ *          launch {
+ *             isMuted.collect { // access to the mute state }
+ *          }
+ *      }
+ *
+ * **Note:** Each [Flow] must be wrapped in an individual launch block or the [Flow] will not be
+ *  collected.
  */
 interface CallControlScope : CoroutineScope {
     /**
diff --git a/core/core-telecom/src/main/java/androidx/core/telecom/CallsManager.kt b/core/core-telecom/src/main/java/androidx/core/telecom/CallsManager.kt
index c49953d..e5f9772 100644
--- a/core/core-telecom/src/main/java/androidx/core/telecom/CallsManager.kt
+++ b/core/core-telecom/src/main/java/androidx/core/telecom/CallsManager.kt
@@ -404,17 +404,24 @@
     ) {
         try {
             withTimeout(ADD_CALL_TIMEOUT) {
+                // This log will print once a request is sent to the platform to add a new call.
+                // It is necessary to pause execution so Core-Telecom does not run the clients
+                // CallControlScope before the call is returned from the platform.
                 Log.i(TAG, "addCall: pausing [$coroutineContext] execution" +
                     " until the CallControl or Connection is ready")
                 openResult.await()
             }
         } catch (timeout: TimeoutCancellationException) {
+            // If this block is entered, the platform failed to create the call in time and hung.
             Log.i(TAG, "addCall: timeout hit; canceling call in context=[$coroutineContext]")
             if (request != null) {
                 JetpackConnectionService.mPendingConnectionRequests.remove(request)
             }
             openResult.cancel(CancellationException(CALL_CREATION_FAILURE_MSG))
         }
+        // This log will print once the CallControl object or Connection is returned from the
+        // the platform. This means the call was added successfully and Core-Telecom is ready to
+        // run the clients CallControlScope block.
         Log.i(TAG, "addCall: creating call session and running the clients scope")
     }
 
diff --git a/core/core/api/api_lint.ignore b/core/core/api/api_lint.ignore
index 2c91af6..3da615d 100644
--- a/core/core/api/api_lint.ignore
+++ b/core/core/api/api_lint.ignore
@@ -935,6 +935,22 @@
     Provide an explicit copy constructor instead of implementing `clone()`
 
 
+NotCloseable: androidx.core.app.FrameMetricsAggregator:
+    Classes that release resources (stop()) should implement AutoCloseable and CloseGuard: class androidx.core.app.FrameMetricsAggregator
+NotCloseable: androidx.core.util.Pools.Pool:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class androidx.core.util.Pools.Pool
+NotCloseable: androidx.core.util.Pools.SimplePool:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class androidx.core.util.Pools.SimplePool
+NotCloseable: androidx.core.util.Pools.SynchronizedPool:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class androidx.core.util.Pools.SynchronizedPool
+NotCloseable: androidx.core.view.DragAndDropPermissionsCompat:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class androidx.core.view.DragAndDropPermissionsCompat
+NotCloseable: androidx.core.view.WindowInsetsAnimationControllerCompat:
+    Classes that release resources (finish()) should implement AutoCloseable and CloseGuard: class androidx.core.view.WindowInsetsAnimationControllerCompat
+NotCloseable: androidx.core.widget.EdgeEffectCompat:
+    Classes that release resources (finish()) should implement AutoCloseable and CloseGuard: class androidx.core.widget.EdgeEffectCompat
+
+
 NullableCollection: androidx.core.app.ActivityOptionsCompat#toBundle():
     Return type of method androidx.core.app.ActivityOptionsCompat.toBundle() is a nullable collection (`android.os.Bundle`); must be non-null
 NullableCollection: androidx.core.app.FrameMetricsAggregator#getMetrics():
diff --git a/core/core/lint-baseline.xml b/core/core/lint-baseline.xml
index 5a6970a..a35d552 100644
--- a/core/core/lint-baseline.xml
+++ b/core/core/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 14): `java.util.Optional#of`"
+        message="Call requires API level 24 (current min is 19): `java.util.Optional#of`"
         errorLine1="                return Optional.of(modeCompat);"
         errorLine2="                                ~~">
         <location
@@ -12,7 +12,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 14): `java.util.Optional#empty`"
+        message="Call requires API level 24 (current min is 19): `java.util.Optional#empty`"
         errorLine1="        return Optional.empty();"
         errorLine2="                        ~~~~~">
         <location
@@ -21,25 +21,7 @@
 
     <issue
         id="NewApi"
-        message="Class requires API level 17 (current min is 14): `android.hardware.display.DisplayManager`"
-        errorLine1="        mDisplayManager = (DisplayManager) mContext.getSystemService(DISPLAY_SERVICE);"
-        errorLine2="                           ~~~~~~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/core/view/DisplayCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `android.hardware.display.DisplayManager#getDisplay`"
-        errorLine1="        mDefaultDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/core/view/DisplayCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 14): `java.util.Optional#get`"
+        message="Call requires API level 24 (current min is 19): `java.util.Optional#get`"
         errorLine1="                findNativeMode(DisplayCompat.getSupportedModes(mContext, mDefaultDisplay)).get();"
         errorLine2="                                                                                           ~~~">
         <location
@@ -48,16 +30,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 17 (current min is 14): `android.hardware.display.DisplayManager#getDisplay`"
-        errorLine1="        Display secondDisplay = mDisplayManager.getDisplay(secondDisplayId);"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/core/view/DisplayCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 14): `java.util.Optional#get`"
+        message="Call requires API level 24 (current min is 19): `java.util.Optional#get`"
         errorLine1="                findNativeMode(DisplayCompat.getSupportedModes(mContext, secondDisplay)).get();"
         errorLine2="                                                                                         ~~~">
         <location
@@ -66,7 +39,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 14): `java.util.Optional#get`"
+        message="Call requires API level 24 (current min is 19): `java.util.Optional#get`"
         errorLine1="                findNativeMode(DisplayCompat.getSupportedModes(mContext, mDefaultDisplay)).get();"
         errorLine2="                                                                                           ~~~">
         <location
@@ -75,7 +48,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 14): `java.util.Optional#get`"
+        message="Call requires API level 24 (current min is 19): `java.util.Optional#get`"
         errorLine1="                findNativeMode(DisplayCompat.getSupportedModes(mContext, mDefaultDisplay)).get();"
         errorLine2="                                                                                           ~~~">
         <location
@@ -84,43 +57,7 @@
 
     <issue
         id="NewApi"
-        message="Cast from `OutputStream` to `AutoCloseable` requires API level 19 (current min is 14)"
-        errorLine1="            closeQuietly(out);"
-        errorLine2="                         ~~~">
-        <location
-            file="src/androidTest/java/androidx/core/content/FileProviderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `OutputStream` to `AutoCloseable` requires API level 19 (current min is 14)"
-        errorLine1="            closeQuietly(out);"
-        errorLine2="                         ~~~">
-        <location
-            file="src/androidTest/java/androidx/core/content/FileProviderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `InputStream` to `AutoCloseable` requires API level 19 (current min is 14)"
-        errorLine1="            closeQuietly(in);"
-        errorLine2="                         ~~">
-        <location
-            file="src/androidTest/java/androidx/core/content/FileProviderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `java.lang.AutoCloseable#close`"
-        errorLine1="                closeable.close();"
-        errorLine2="                          ~~~~~">
-        <location
-            file="src/androidTest/java/androidx/core/content/FileProviderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getImportance`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getImportance`"
         errorLine1="            boolean equality = nc1.getImportance() == nc2.getImportance()"
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
@@ -129,7 +66,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getImportance`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getImportance`"
         errorLine1="            boolean equality = nc1.getImportance() == nc2.getImportance()"
         errorLine2="                                                          ~~~~~~~~~~~~~">
         <location
@@ -138,7 +75,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#canBypassDnd`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#canBypassDnd`"
         errorLine1="                    &amp;&amp; nc1.canBypassDnd() == nc2.canBypassDnd()"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
@@ -147,7 +84,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#canBypassDnd`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#canBypassDnd`"
         errorLine1="                    &amp;&amp; nc1.canBypassDnd() == nc2.canBypassDnd()"
         errorLine2="                                                 ~~~~~~~~~~~~">
         <location
@@ -156,7 +93,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getLockscreenVisibility`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getLockscreenVisibility`"
         errorLine1="                    &amp;&amp; nc1.getLockscreenVisibility() == nc2.getLockscreenVisibility()"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -165,7 +102,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getLockscreenVisibility`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getLockscreenVisibility`"
         errorLine1="                    &amp;&amp; nc1.getLockscreenVisibility() == nc2.getLockscreenVisibility()"
         errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -174,7 +111,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getLightColor`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getLightColor`"
         errorLine1="                    &amp;&amp; nc1.getLightColor() == nc2.getLightColor()"
         errorLine2="                           ~~~~~~~~~~~~~">
         <location
@@ -183,7 +120,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getLightColor`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getLightColor`"
         errorLine1="                    &amp;&amp; nc1.getLightColor() == nc2.getLightColor()"
         errorLine2="                                                  ~~~~~~~~~~~~~">
         <location
@@ -192,7 +129,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getId`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getId`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getId(), nc2.getId())"
         errorLine2="                                          ~~~~~">
         <location
@@ -201,7 +138,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getId`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getId`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getId(), nc2.getId())"
         errorLine2="                                                       ~~~~~">
         <location
@@ -210,7 +147,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getName`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getName`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getName(), nc2.getName())"
         errorLine2="                                          ~~~~~~~">
         <location
@@ -219,7 +156,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getName`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getName`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getName(), nc2.getName())"
         errorLine2="                                                         ~~~~~~~">
         <location
@@ -228,7 +165,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getDescription`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getDescription`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getDescription(), nc2.getDescription())"
         errorLine2="                                          ~~~~~~~~~~~~~~">
         <location
@@ -237,7 +174,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getDescription`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getDescription`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getDescription(), nc2.getDescription())"
         errorLine2="                                                                ~~~~~~~~~~~~~~">
         <location
@@ -246,7 +183,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getSound`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getSound`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getSound(), nc2.getSound())"
         errorLine2="                                          ~~~~~~~~">
         <location
@@ -255,7 +192,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getSound`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getSound`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getSound(), nc2.getSound())"
         errorLine2="                                                          ~~~~~~~~">
         <location
@@ -264,7 +201,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getVibrationPattern`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getVibrationPattern`"
         errorLine1="                    &amp;&amp; Arrays.equals(nc1.getVibrationPattern(), nc2.getVibrationPattern())"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -273,7 +210,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getVibrationPattern`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getVibrationPattern`"
         errorLine1="                    &amp;&amp; Arrays.equals(nc1.getVibrationPattern(), nc2.getVibrationPattern())"
         errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -282,7 +219,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getGroup`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getGroup`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getGroup(), nc2.getGroup())"
         errorLine2="                                          ~~~~~~~~">
         <location
@@ -291,7 +228,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getGroup`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getGroup`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getGroup(), nc2.getGroup())"
         errorLine2="                                                          ~~~~~~~~">
         <location
@@ -300,7 +237,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getAudioAttributes`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getAudioAttributes`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getAudioAttributes(), nc2.getAudioAttributes());"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
@@ -309,7 +246,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getAudioAttributes`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getAudioAttributes`"
         errorLine1="                    &amp;&amp; Objects.equals(nc1.getAudioAttributes(), nc2.getAudioAttributes());"
         errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~">
         <location
@@ -318,7 +255,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getImportance`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getImportance`"
         errorLine1="            assertEquals(expected.getImportance(), actual.getImportance());"
         errorLine2="                                  ~~~~~~~~~~~~~">
         <location
@@ -327,7 +264,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getLightColor`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getLightColor`"
         errorLine1="            assertEquals(expected.getLightColor(), actual.getLightColor());"
         errorLine2="                                  ~~~~~~~~~~~~~">
         <location
@@ -336,7 +273,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getId`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getId`"
         errorLine1="            assertEquals(expected.getId(), actual.getId());"
         errorLine2="                                  ~~~~~">
         <location
@@ -345,7 +282,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getName`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getName`"
         errorLine1="            assertEquals(expected.getName(), actual.getName());"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -354,7 +291,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getDescription`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getDescription`"
         errorLine1="            assertEquals(expected.getDescription(), actual.getDescription());"
         errorLine2="                                  ~~~~~~~~~~~~~~">
         <location
@@ -363,7 +300,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getSound`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getSound`"
         errorLine1="            assertEquals(expected.getSound(), actual.getSound());"
         errorLine2="                                  ~~~~~~~~">
         <location
@@ -372,7 +309,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getVibrationPattern`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getVibrationPattern`"
         errorLine1="            assertArrayEquals(expected.getVibrationPattern(), actual.getVibrationPattern());"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -381,7 +318,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getGroup`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getGroup`"
         errorLine1="            assertEquals(expected.getGroup(), actual.getGroup());"
         errorLine2="                                  ~~~~~~~~">
         <location
@@ -390,7 +327,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannel#getAudioAttributes`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannel#getAudioAttributes`"
         errorLine1="            assertEquals(expected.getAudioAttributes(), actual.getAudioAttributes());"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~">
         <location
@@ -399,7 +336,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannelGroup#getId`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannelGroup#getId`"
         errorLine1="            assertEquals(expected.getId(), actual.getId());"
         errorLine2="                                  ~~~~~">
         <location
@@ -408,7 +345,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.NotificationChannelGroup#getName`"
+        message="Call requires API level 26 (current min is 19): `android.app.NotificationChannelGroup#getName`"
         errorLine1="            assertEquals(expected.getName(), actual.getName());"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -417,7 +354,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 21 (current min is 14): `addInvisibleAction`"
+        message="Call requires API level 21 (current min is 19): `addInvisibleAction`"
         errorLine1="        Notification nWith = builder.addInvisibleAction(0, &quot;testAction&quot;, null)"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~">
         <location
@@ -426,7 +363,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 21 (current min is 14): `getInvisibleActions`"
+        message="Call requires API level 21 (current min is 19): `getInvisibleActions`"
         errorLine1="        List&lt;NotificationCompat.Action> actions = NotificationCompat.getInvisibleActions(nWith);"
         errorLine2="                                                                     ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -471,7 +408,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 30 (current min is 14): `Builder`"
+        message="Call requires API level 30 (current min is 19): `Builder`"
         errorLine1="                new NotificationCompat.BubbleMetadata.Builder(shortcutId)"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -480,7 +417,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 21 (current min is 14): `getInvisibleActions`"
+        message="Call requires API level 21 (current min is 19): `getInvisibleActions`"
         errorLine1="                NotificationCompat.getInvisibleActions(notification);"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -489,25 +426,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 19 (current min is 14): `android.app.Notification#extras`"
-        errorLine1="        assertBundleEquals(&quot;Notification.extras&quot;, n2.extras, n2.extras)"
-        errorLine2="                                                  ~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/core/app/NotificationTester.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 19 (current min is 14): `android.app.Notification#extras`"
-        errorLine1="        assertBundleEquals(&quot;Notification.extras&quot;, n2.extras, n2.extras)"
-        errorLine2="                                                             ~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/core/app/NotificationTester.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 14): `setBreakStrategy`"
+        message="Call requires API level 23 (current min is 19): `setBreakStrategy`"
         errorLine1="                .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE).build());"
         errorLine2="                 ~~~~~~~~~~~~~~~~">
         <location
@@ -516,7 +435,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `setBreakStrategy`"
+        message="Call requires API level 23 (current min is 19): `setBreakStrategy`"
         errorLine1="                .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)"
         errorLine2="                 ~~~~~~~~~~~~~~~~">
         <location
@@ -525,7 +444,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `setHyphenationFrequency`"
+        message="Call requires API level 23 (current min is 19): `setHyphenationFrequency`"
         errorLine1="                .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL).build());"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -534,7 +453,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `setBreakStrategy`"
+        message="Call requires API level 23 (current min is 19): `setBreakStrategy`"
         errorLine1="                .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)"
         errorLine2="                 ~~~~~~~~~~~~~~~~">
         <location
@@ -543,7 +462,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `setHyphenationFrequency`"
+        message="Call requires API level 23 (current min is 19): `setHyphenationFrequency`"
         errorLine1="                .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -552,25 +471,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 18 (current min is 14): `setTextDirection`"
-        errorLine1="                .setTextDirection(LTR).build());"
-        errorLine2="                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/core/text/PrecomputedTextCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 18 (current min is 14): `android.text.TextDirectionHeuristics#LTR`"
-        errorLine1="                .setTextDirection(LTR).build());"
-        errorLine2="                                  ~~~">
-        <location
-            file="src/androidTest/java/androidx/core/text/PrecomputedTextCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 14): `getBreakStrategy`"
+        message="Call requires API level 23 (current min is 19): `getBreakStrategy`"
         errorLine1="                .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE).build().getBreakStrategy());"
         errorLine2="                                                                        ~~~~~~~~~~~~~~~~">
         <location
@@ -579,7 +480,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `setBreakStrategy`"
+        message="Call requires API level 23 (current min is 19): `setBreakStrategy`"
         errorLine1="                .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE).build().getBreakStrategy());"
         errorLine2="                 ~~~~~~~~~~~~~~~~">
         <location
@@ -588,7 +489,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `setHyphenationFrequency`"
+        message="Call requires API level 23 (current min is 19): `setHyphenationFrequency`"
         errorLine1="                .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE).build()"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -597,7 +498,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `getHyphenationFrequency`"
+        message="Call requires API level 23 (current min is 19): `getHyphenationFrequency`"
         errorLine1="                .getHyphenationFrequency());"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -606,43 +507,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 18 (current min is 14): `setTextDirection`"
-        errorLine1="        assertEquals(RTL, new Params.Builder(PAINT).setTextDirection(RTL).build()"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/core/text/PrecomputedTextCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 18 (current min is 14): `android.text.TextDirectionHeuristics#RTL`"
-        errorLine1="        assertEquals(RTL, new Params.Builder(PAINT).setTextDirection(RTL).build()"
-        errorLine2="                     ~~~">
-        <location
-            file="src/androidTest/java/androidx/core/text/PrecomputedTextCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 18 (current min is 14): `android.text.TextDirectionHeuristics#RTL`"
-        errorLine1="        assertEquals(RTL, new Params.Builder(PAINT).setTextDirection(RTL).build()"
-        errorLine2="                                                                     ~~~">
-        <location
-            file="src/androidTest/java/androidx/core/text/PrecomputedTextCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 18 (current min is 14): `getTextDirection`"
-        errorLine1="                .getTextDirection());"
-        errorLine2="                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/core/text/PrecomputedTextCompatTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 25 (current min is 14): `toShortcutInfo`"
+        message="Call requires API level 25 (current min is 19): `toShortcutInfo`"
         errorLine1="                .toShortcutInfo());"
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
@@ -651,7 +516,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 25 (current min is 14): `toShortcutInfo`"
+        message="Call requires API level 25 (current min is 19): `toShortcutInfo`"
         errorLine1="                .toShortcutInfo());"
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
@@ -660,7 +525,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 25 (current min is 14): `toShortcutInfo`"
+        message="Call requires API level 25 (current min is 19): `toShortcutInfo`"
         errorLine1="                .toShortcutInfo());"
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
@@ -669,7 +534,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 25 (current min is 14): `toShortcutInfo`"
+        message="Call requires API level 25 (current min is 19): `toShortcutInfo`"
         errorLine1="                .toShortcutInfo());"
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
@@ -678,7 +543,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 25 (current min is 14): `toShortcutInfo`"
+        message="Call requires API level 25 (current min is 19): `toShortcutInfo`"
         errorLine1="                .toShortcutInfo());"
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
@@ -687,7 +552,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 14): `android.telephony.SubscriptionManager#getDefaultSubscriptionId`"
+        message="Call requires API level 24 (current min is 19): `android.telephony.SubscriptionManager#getDefaultSubscriptionId`"
         errorLine1="                assertEquals(getDefaultSubscriptionId(), actual);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -696,7 +561,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 24 (current min is 14): `android.telephony.SubscriptionManager#getDefaultSubscriptionId`"
+        message="Call requires API level 24 (current min is 19): `android.telephony.SubscriptionManager#getDefaultSubscriptionId`"
         errorLine1="                assertEquals(expected, getDefaultSubscriptionId());"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -705,7 +570,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 21 (current min is 14): `new android.widget.FrameLayout`"
+        message="Call requires API level 21 (current min is 19): `new android.widget.FrameLayout`"
         errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
         errorLine2="        ~~~~~">
         <location
@@ -714,7 +579,7 @@
 
     <issue
         id="NewApi"
-        message="Class requires API level 26 (current min is 14): `OreoCallback`"
+        message="Class requires API level 26 (current min is 19): `OreoCallback`"
         errorLine1="        if (callback instanceof OreoCallback &amp;&amp; Build.VERSION.SDK_INT >= 26) {"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
@@ -723,7 +588,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 20 (current min is 14): `android.view.View#requestApplyInsets`"
+        message="Call requires API level 20 (current min is 19): `android.view.View#requestApplyInsets`"
         errorLine1="    post { requestApplyInsets() }"
         errorLine2="           ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1011,51 +876,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return new CollectionInfoCompat(AccessibilityNodeInfo.CollectionInfo.obtain("
-        errorLine2="                                                                                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return new CollectionInfoCompat(AccessibilityNodeInfo.CollectionInfo.obtain("
-        errorLine2="                                                                                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getColumnCount();"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getRowCount();"
-        errorLine2="                                                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).isHierarchical();"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getSelectionMode();"
         errorLine2="                                                                      ~~~~~~~~~~~~~~~~">
@@ -1074,69 +894,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return new CollectionItemInfoCompat(AccessibilityNodeInfo.CollectionItemInfo.obtain("
-        errorLine2="                                                                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return new CollectionItemInfoCompat(AccessibilityNodeInfo.CollectionItemInfo.obtain("
-        errorLine2="                                                                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getColumnIndex();"
-        errorLine2="                                                                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getColumnSpan();"
-        errorLine2="                                                                          ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getRowIndex();"
-        errorLine2="                                                                          ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getRowSpan();"
-        errorLine2="                                                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).isHeading();"
-        errorLine2="                                                                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).isSelected();"
         errorLine2="                                                                          ~~~~~~~~~~">
@@ -1146,51 +903,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        AccessibilityNodeInfo.RangeInfo.obtain(type, min, max, current));"
-        errorLine2="                                                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getCurrent();"
-        errorLine2="                                                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getMax();"
-        errorLine2="                                                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getMin();"
-        errorLine2="                                                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getType();"
-        errorLine2="                                                                 ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mInfo = new TouchDelegateInfo(targetMap);"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
@@ -1227,51 +939,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    AccessibilityNodeInfo.obtain(root, virtualDescendantId));"
-        errorLine2="                                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setSource(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.findFocus(focus));"
-        errorLine2="                                                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.focusSearch(direction));"
-        errorLine2="                                                                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.addChild(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; 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.removeChild(child);"
         errorLine2="                         ~~~~~~~~~~~">
@@ -1308,78 +975,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; 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.performAction(action, arguments);"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setMovementGranularities(granularities);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; 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.getMovementGranularities();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setParent(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; 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.isVisibleToUser();"
-        errorLine2="                         ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setVisibleToUser(visibleToUser);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; 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.isAccessibilityFocused();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setAccessibilityFocused(focused);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 24; 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.isImportantForAccessibility();"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1398,42 +993,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setViewIdResourceName(viewId);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; 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.getViewIdResourceName();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.getLiveRegion();"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.setLiveRegion(mode);"
-        errorLine2="                  ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 24; 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.getDrawingOrder();"
         errorLine2="                         ~~~~~~~~~~~~~~~">
@@ -1452,60 +1011,6 @@
 
     <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="            AccessibilityNodeInfo.CollectionInfo info = mInfo.getCollectionInfo();"
-        errorLine2="                                                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.setCollectionInfo((collectionInfo == null) ? null"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.setCollectionItemInfo((collectionItemInfo == null) ? null"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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="            AccessibilityNodeInfo.CollectionItemInfo info = mInfo.getCollectionItemInfo();"
-        errorLine2="                                                                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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="            AccessibilityNodeInfo.RangeInfo info = mInfo.getRangeInfo();"
-        errorLine2="                                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.setRangeInfo((AccessibilityNodeInfo.RangeInfo) rangeInfo.mInfo);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            actions = (List&lt;Object>) (List&lt;?>) mInfo.getActionList();"
         errorLine2="                                                     ~~~~~~~~~~~~~">
@@ -1515,24 +1020,6 @@
 
     <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.setContentInvalid(contentInvalid);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.isContentInvalid();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; 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.isContextClickable();"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~">
@@ -1587,105 +1074,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setLabelFor(labeled);"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setLabelFor(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getLabelFor());"
-        errorLine2="                                                                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setLabeledBy(label);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setLabeledBy(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getLabeledBy());"
-        errorLine2="                                                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.canOpenPopup();"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.setCanOpenPopup(opensPopup);"
-        errorLine2="                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            List&lt;AccessibilityNodeInfo> nodes = mInfo.findAccessibilityNodeInfosByViewId(viewId);"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.getInputType();"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.setInputType(inputType);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 26; 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.getAvailableExtraData();"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
@@ -1722,33 +1110,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setTextSelection(start, end);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; 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.getTextSelectionStart();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; 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.getTextSelectionEnd();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 22; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getTraversalBefore());"
         errorLine2="                                                                         ~~~~~~~~~~~~~~~~~~">
@@ -1812,60 +1173,6 @@
 
     <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.isDismissable();"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.setDismissable(dismissable);"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; 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.isEditable();"
-        errorLine2="                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setEditable(editable);"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.isMultiLine();"
-        errorLine2="                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </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.setMultiLine(multiLine);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 28; 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.getTooltipText();"
         errorLine2="                         ~~~~~~~~~~~~~~">
@@ -1974,15 +1281,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; 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.refresh();"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            TouchDelegateInfo delegateInfo = mInfo.getTouchDelegateInfo();"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~">
@@ -2001,33 +1299,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.accessibilityservice.AccessibilityServiceInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return info.loadDescription(packageManager);"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.core.accessibilityservice.AccessibilityServiceInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return info.getCapabilities();"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.app.ActivityManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return activityManager.isLowRamDevice();"
-        errorLine2="                                   ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 33; however, the containing class androidx.core.os.LocaleListCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return LocaleList.matchesLanguageAndScript(supported, desired);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2181,24 +1452,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                if (!mPaint.getTextLocale().equals(other.getTextPaint().getTextLocale())) {"
-        errorLine2="                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                if (!mPaint.getTextLocale().equals(other.getTextPaint().getTextLocale())) {"
-        errorLine2="                                                                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mPaint.getTextSkewX(), mPaint.getLetterSpacing(), mPaint.getFlags(),"
         errorLine2="                                                      ~~~~~~~~~~~~~~~~">
@@ -2235,15 +1488,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        mPaint.getTextLocale(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
-        errorLine2="                               ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mPaint.getTextLocale(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
         errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
@@ -2253,24 +1497,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        mPaint.getTextSkewX(), mPaint.getFlags(), mPaint.getTextLocale(),"
-        errorLine2="                                                                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        mPaint.getTextSkewX(), mPaint.getFlags(), mPaint.getTextLocale(),"
-        errorLine2="                                                                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                sb.append(&quot;, letterSpacing=&quot; + mPaint.getLetterSpacing());"
         errorLine2="                                                      ~~~~~~~~~~~~~~~~">
@@ -2298,15 +1524,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                sb.append(&quot;, textLocale=&quot; + mPaint.getTextLocale());"
-        errorLine2="                                                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 26; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                sb.append(&quot;, variationSettings=&quot; + mPaint.getFontVariationSettings());"
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -3324,15 +2541,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                Build.VERSION.SDK_INT &lt; 19 || am == null || am.isLowRamDevice();"
-        errorLine2="                                                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            textView.setTextAppearance(resId);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~">
@@ -3350,6 +2558,4169 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(16)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (!success &amp;&amp; Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19 &amp;&amp; Build.VERSION.SDK_INT &lt; 26) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BitmapCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BitmapCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BitmapCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BitmapCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BitmapCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/BundleCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/BundleCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/BundleCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (obj != null &amp;&amp; Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/CancellationSignal.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/CancellationSignal.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/CancellationSignal.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/CheckedTextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/CheckedTextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/ConfigurationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/ConfigurationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/ConfigurationHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/net/ConnectivityManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/net/ConnectivityManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContentResolverCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContentResolverCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt;= 32 &amp;&amp; Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/database/CursorWindowCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/database/CursorWindowCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/DocumentsContractCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/DocumentsContractCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/DocumentsContractCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/DocumentsContractCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/DocumentsContractCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/EnvironmentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/EnvironmentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/FontProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/FontProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/FontsContractCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT > 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GestureDetectorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GravityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GravityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GravityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GravityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GravityCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/HandlerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/HandlerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/HandlerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/HandlerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/IntentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/IntentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/IntentSanitizer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/IntentSanitizer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/IntentSanitizer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/IntentSanitizer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ListViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ListViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ListViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 19 &amp;&amp; Api19Impl.tryRequestLocationUpdates("
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 19 &amp;&amp; Api19Impl.tryRequestLocationUpdates("
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (VERSION.SDK_INT >= 19) { // Satisfy reflection lint check"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (VERSION.SDK_INT >= 19) { // Satisfy reflection lint check"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationRequestCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationRequestCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (VERSION.SDK_INT >= 19) { // Satisfy reflection lint check"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationRequestCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (sTrySetAsynchronous &amp;&amp; Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/MessageCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (sTryIsAsynchronous &amp;&amp; Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/MessageCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NavUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NavUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NavUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NavUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NavUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16 &amp;&amp; Build.VERSION.SDK_INT &lt; 21) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (mBuilder.mSubText != null &amp;&amp; Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (showLine2 &amp;&amp; Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (mBuilder.mUseChronometer &amp;&amp; Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(16)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(16)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="            @RequiresApi(16)"
+        errorLine2="            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="            @RequiresApi(16)"
+        errorLine2="            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(16)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(16)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(16)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(16)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="        @RequiresApi(15)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(16)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            @RequiresApi(19)"
+        errorLine2="            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= 16 &amp;&amp; parcelables != null) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16 &amp;&amp; style != null) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16 &amp;&amp; style != null) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatJellybean.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/ObjectsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/ObjectsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/ObjectsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/PendingIntentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/PendingIntentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/PendingIntentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupMenuCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupMenuCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="            @RequiresApi(18)"
+        errorLine2="            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="        @RequiresApi(18)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/ProcessCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT == 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/ProcessCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/ProcessCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/ProcessCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (SDK_INT >= 15) {"
+        errorLine2="                   ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (SDK_INT &lt; 16) {"
+        errorLine2="            ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ShareCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (SDK_INT >= 16) {"
+        errorLine2="                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ShareCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (SDK_INT >= 16) {"
+        errorLine2="                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ShareCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (SDK_INT >= 16) {"
+        errorLine2="                    ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ShareCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (SDK_INT >= 16) {"
+        errorLine2="                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ShareCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ShareCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="                Build.VERSION.SDK_INT &lt; 19 || am == null || am.isLowRamDevice();"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/TaskStackBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/TaskStackBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/TextUtilsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/TextUtilsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/TextUtilsCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.JELLY_BEAN"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.JELLY_BEAN"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewOnReceiveContentListener.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16) // For ClipData.Item.coerceToStyledText()"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewOnReceiveContentListener.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18 &amp;&amp; Build.VERSION.SDK_INT &lt; 29) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/UserHandleCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            return Build.VERSION.SDK_INT >= 19;"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroupCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroupCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroupCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16 || !mAnimEndCalled) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/WindowCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/WindowCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/WrappedDrawableApi14.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/WrappedDrawableApi14.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v16`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `layout`.">
+        <location
+            file="src/main/res/layout-v16"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v16`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
+        <location
+            file="src/main/res/values-v16"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `parent` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public AccessibilityNodeInfoCompat getParent() {"
@@ -4930,150 +8301,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static Path createPathFromPathData(String pathData) {"
-        errorLine2="                  ~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static Path createPathFromPathData(String pathData) {"
-        errorLine2="                                              ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static PathDataNode[] createNodesFromPathData(String pathData) {"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static PathDataNode[] createNodesFromPathData(String pathData) {"
-        errorLine2="                                                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static PathDataNode[] deepCopyNodes(PathDataNode[] source) {"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static PathDataNode[] deepCopyNodes(PathDataNode[] source) {"
-        errorLine2="                                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static void updateNodes(PathDataNode[] target, PathDataNode[] source) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static void updateNodes(PathDataNode[] target, PathDataNode[] source) {"
-        errorLine2="                                                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static boolean interpolatePathDataNodes(PathDataNode[] target, PathDataNode[] from,"
-        errorLine2="                                                   ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static boolean interpolatePathDataNodes(PathDataNode[] target, PathDataNode[] from,"
-        errorLine2="                                                                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="            PathDataNode[] to, float fraction) {"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="        public float[] mParams;"
-        errorLine2="               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="        public static void nodesToPath(PathDataNode[] node, Path path) {"
-        errorLine2="                                       ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="        public static void nodesToPath(PathDataNode[] node, Path path) {"
-        errorLine2="                                                            ~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="        public void interpolatePathDataNode(PathDataNode nodeFrom, PathDataNode nodeTo,"
-        errorLine2="                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="        public void interpolatePathDataNode(PathDataNode nodeFrom, PathDataNode nodeTo,"
-        errorLine2="                                                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathParser.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            public Builder setBreakStrategy(int strategy) {"
         errorLine2="                   ~~~~~~~">
         <location
diff --git a/core/core/src/main/java/androidx/core/content/IntentSanitizer.java b/core/core/src/main/java/androidx/core/content/IntentSanitizer.java
index 154a9fc..aab9a33 100644
--- a/core/core/src/main/java/androidx/core/content/IntentSanitizer.java
+++ b/core/core/src/main/java/androidx/core/content/IntentSanitizer.java
@@ -510,7 +510,9 @@
         }
 
         /**
-         * Add a package to the allowed packages.
+         * Add a package to the allowed packages. This does not imply the intent can contain
+         * a component from the allowed package; instead, this value will be compared against
+         * the result returned from the Intent's {@link Intent#getPackage()} method.
          * This method can be called multiple times and the result is additive. They will not
          * overwrite each other.
          *
@@ -524,7 +526,9 @@
         }
 
         /**
-         * Add a filter for allowed packages.
+         * Add a filter for allowed packages. This does not imply the intent can contain
+         * a component from the allowed package; instead, this value will be compared against
+         * the result returned from the Intent's {@link Intent#getPackage()} method.
          * This method can be called multiple times and the result is additive. They will not
          * overwrite each other.
          *
@@ -572,7 +576,8 @@
         }
 
         /**
-         * Add a package to the allowed package list. Any component under this package is allowed.
+         * Allow any component under the specified package. Note this does not allow the
+         * package itself. If the intent contains a package, call allowPackage method.
          * This method can be called multiple times and the result is additive. They will not
          * overwrite each other.
          *
diff --git a/core/core/src/test/java/androidx/core/content/IntentSanitizerTest.java b/core/core/src/test/java/androidx/core/content/IntentSanitizerTest.java
index 29399f5..dbbb31b 100644
--- a/core/core/src/test/java/androidx/core/content/IntentSanitizerTest.java
+++ b/core/core/src/test/java/androidx/core/content/IntentSanitizerTest.java
@@ -640,7 +640,6 @@
     }
 
     @Test
-    @Config(minSdk = 16)
     public void intentWithTextOnlyClipData_builderAllowsNoClipData_filterOut() {
         Intent intent = basicIntent();
         ClipDescription description = new ClipDescription("test",
@@ -655,7 +654,6 @@
     }
 
     @Test
-    @Config(minSdk = 16)
     public void intentWithTextOnlyClipData_builderAllowsClipDataText_filterIn() {
         Intent intent = basicIntent();
         ClipDescription description = new ClipDescription("test",
@@ -671,7 +669,6 @@
     }
 
     @Test
-    @Config(minSdk = 16)
     public void intentWithClipDataWithTextAndUri_builderAllowsClipDataText_filterInTextButOutUri() {
         Intent intent = basicIntent();
         ClipDescription description = new ClipDescription("test",
@@ -690,7 +687,6 @@
     }
 
     @Test
-    @Config(minSdk = 16)
     public void intentWithClipDataWithTextAndUri_builderAllowsClipDataUri_filterInUriButOutText() {
         Intent intent = basicIntent();
         ClipDescription description = new ClipDescription("test",
@@ -710,7 +706,6 @@
     }
 
     @Test
-    @Config(minSdk = 16)
     public void intentWithClipDataWithTextAndUri_builderAllowsClipDataTextAndUri_filterIn() {
         Intent intent = basicIntent();
         ClipDescription description = new ClipDescription("test",
@@ -730,7 +725,6 @@
     }
 
     @Test
-    @Config(minSdk = 16)
     public void intentWithClipDataMultiItems_builderAllowsTextAndUri_filterInItemPassUriFilter() {
         Intent intent = basicIntent();
         ClipDescription description = new ClipDescription("test",
@@ -751,7 +745,6 @@
     }
 
     @Test
-    @Config(minSdk = 16)
     public void intentWithClipDataWithPlainMimeType_builderAllowsHtmlMimeTypePredicate_filterOut() {
         Intent intent = basicIntent();
         ClipDescription description = new ClipDescription("test",
@@ -878,7 +871,6 @@
     }
 
     @Test
-    @Config(minSdk = Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
     public void intentWithSelector_builderAllowsNoSelector_filterOut() {
         Intent intent = basicIntent();
         Intent selector = new Intent(Intent.ACTION_VIEW);
@@ -891,7 +883,6 @@
     }
 
     @Test
-    @Config(minSdk = Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
     public void intentWithSelector_builderAllowsSelector_filterIn() {
         Intent intent = basicIntent();
         Intent selector = new Intent(Intent.ACTION_VIEW);
diff --git a/credentials/credentials/api/api_lint.ignore b/credentials/credentials/api/api_lint.ignore
index 74db66e..8d0b1d6 100644
--- a/credentials/credentials/api/api_lint.ignore
+++ b/credentials/credentials/api/api_lint.ignore
@@ -5,9 +5,3 @@
     Invalid name for boolean property `preferIdentityDocUi`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field GetCredentialRequest.preferImmediatelyAvailableCredentials:
     Invalid name for boolean property `preferImmediatelyAvailableCredentials`. Should start with one of `has`, `can`, `should`, `is`.
-
-
-MissingGetterMatchingBuilder: androidx.credentials.PrepareGetCredentialResponse.Builder#setFrameworkResponse(android.credentials.PrepareGetCredentialResponse):
-    androidx.credentials.PrepareGetCredentialResponse does not declare a `getFrameworkResponse()` method matching method androidx.credentials.PrepareGetCredentialResponse.Builder.setFrameworkResponse(android.credentials.PrepareGetCredentialResponse)
-MissingGetterMatchingBuilder: androidx.credentials.PrepareGetCredentialResponse.Builder#setIsNullHandlesForTest(boolean):
-    androidx.credentials.PrepareGetCredentialResponse does not declare a `isIsNullHandlesForTest()` method matching method androidx.credentials.PrepareGetCredentialResponse.Builder.setIsNullHandlesForTest(boolean)
diff --git a/customview/customview/api/api_lint.ignore b/customview/customview/api/api_lint.ignore
index d0f1400..00d5913 100644
--- a/customview/customview/api/api_lint.ignore
+++ b/customview/customview/api/api_lint.ignore
@@ -35,6 +35,10 @@
     Missing nullability on parameter `info` in method `onInitializeAccessibilityNodeInfo`
 
 
+NotCloseable: androidx.customview.widget.Openable:
+    Classes that release resources (close()) should implement AutoCloseable and CloseGuard: class androidx.customview.widget.Openable
+
+
 ParcelConstructor: androidx.customview.view.AbsSavedState#AbsSavedState(android.os.Parcel):
     Parcelable inflation is exposed through CREATOR, not raw constructors, in androidx.customview.view.AbsSavedState
 
diff --git a/datastore/datastore-core-okio/api/current.txt b/datastore/datastore-core-okio/api/current.txt
index 696e22b..53d375d 100644
--- a/datastore/datastore-core-okio/api/current.txt
+++ b/datastore/datastore-core-okio/api/current.txt
@@ -13,5 +13,9 @@
     method public androidx.datastore.core.StorageConnection<T> createConnection();
   }
 
+  public final class OkioStorageKt {
+    method public static androidx.datastore.core.InterProcessCoordinator createSingleProcessCoordinator(okio.Path path);
+  }
+
 }
 
diff --git a/datastore/datastore-core-okio/api/restricted_current.txt b/datastore/datastore-core-okio/api/restricted_current.txt
index 696e22b..53d375d 100644
--- a/datastore/datastore-core-okio/api/restricted_current.txt
+++ b/datastore/datastore-core-okio/api/restricted_current.txt
@@ -13,5 +13,9 @@
     method public androidx.datastore.core.StorageConnection<T> createConnection();
   }
 
+  public final class OkioStorageKt {
+    method public static androidx.datastore.core.InterProcessCoordinator createSingleProcessCoordinator(okio.Path path);
+  }
+
 }
 
diff --git a/datastore/datastore-core-okio/src/commonMain/kotlin/androidx/datastore/core/okio/OkioStorage.kt b/datastore/datastore-core-okio/src/commonMain/kotlin/androidx/datastore/core/okio/OkioStorage.kt
index f1e9054..cf63f3e 100644
--- a/datastore/datastore-core-okio/src/commonMain/kotlin/androidx/datastore/core/okio/OkioStorage.kt
+++ b/datastore/datastore-core-okio/src/commonMain/kotlin/androidx/datastore/core/okio/OkioStorage.kt
@@ -45,8 +45,8 @@
 public class OkioStorage<T>(
     private val fileSystem: FileSystem,
     private val serializer: OkioSerializer<T>,
-    private val coordinatorProducer: (Path, FileSystem) -> InterProcessCoordinator = { _, _ ->
-        createSingleProcessCoordinator()
+    private val coordinatorProducer: (Path, FileSystem) -> InterProcessCoordinator = { path, _ ->
+        createSingleProcessCoordinator(path)
     },
     private val producePath: () -> Path
 ) : Storage<T> {
@@ -214,3 +214,11 @@
         }
     }
 }
+
+/**
+ * Create a coordinator for single process use cases.
+ *
+ * @param path The canonical path of the file managed by [SingleProcessCoordinator]
+ */
+public fun createSingleProcessCoordinator(path: Path): InterProcessCoordinator =
+    createSingleProcessCoordinator(path.normalized().toString())
diff --git a/datastore/datastore-core/api/current.txt b/datastore/datastore-core/api/current.txt
index 8eac7fc..b8b292d 100644
--- a/datastore/datastore-core/api/current.txt
+++ b/datastore/datastore-core/api/current.txt
@@ -51,8 +51,8 @@
     property public abstract kotlinx.coroutines.flow.Flow<kotlin.Unit> updateNotifications;
   }
 
-  public final class InterProcessCoordinatorKt {
-    method public static androidx.datastore.core.InterProcessCoordinator createSingleProcessCoordinator();
+  public final class InterProcessCoordinator_jvmKt {
+    method public static androidx.datastore.core.InterProcessCoordinator createSingleProcessCoordinator(java.io.File file);
   }
 
   public final class MultiProcessCoordinatorKt {
diff --git a/datastore/datastore-core/api/restricted_current.txt b/datastore/datastore-core/api/restricted_current.txt
index 8eac7fc..b8b292d 100644
--- a/datastore/datastore-core/api/restricted_current.txt
+++ b/datastore/datastore-core/api/restricted_current.txt
@@ -51,8 +51,8 @@
     property public abstract kotlinx.coroutines.flow.Flow<kotlin.Unit> updateNotifications;
   }
 
-  public final class InterProcessCoordinatorKt {
-    method public static androidx.datastore.core.InterProcessCoordinator createSingleProcessCoordinator();
+  public final class InterProcessCoordinator_jvmKt {
+    method public static androidx.datastore.core.InterProcessCoordinator createSingleProcessCoordinator(java.io.File file);
   }
 
   public final class MultiProcessCoordinatorKt {
diff --git a/datastore/datastore-core/build.gradle b/datastore/datastore-core/build.gradle
index 8e66e09..2416171 100644
--- a/datastore/datastore-core/build.gradle
+++ b/datastore/datastore-core/build.gradle
@@ -78,15 +78,20 @@
             dependencies {
                 api(libs.kotlinStdlib)
                 api(libs.kotlinCoroutinesCore)
+                api("androidx.annotation:annotation:1.7.0")
             }
         }
-        jvmMain {
-            dependencies {
-                api("androidx.annotation:annotation:1.3.0")
-            }
+
+        commonJvmMain {
+            dependsOn(commonMain)
         }
+
         androidMain {
-            dependsOn(jvmMain)
+            dependsOn(commonJvmMain)
+        }
+
+        jvmMain {
+            dependsOn(commonJvmMain)
         }
 
         commonTest {
@@ -101,7 +106,8 @@
             }
         }
 
-        jvmTest {
+        commonJvmTest {
+            dependsOn(commonTest)
             dependencies {
                 implementation(libs.junit)
                 implementation(libs.kotlinTest)
@@ -113,15 +119,19 @@
             }
         }
 
+        jvmTest {
+            dependsOn(commonJvmTest)
+        }
+
         androidUnitTest {
-            dependsOn(jvmTest)
+            dependsOn(commonJvmTest)
             dependencies {
                 implementation(libs.protobufLite)
             }
         }
 
         androidInstrumentedTest {
-            dependsOn(jvmTest)
+            dependsOn(commonJvmTest)
             dependencies {
                 implementation(libs.protobufLite)
                 implementation(libs.truth)
@@ -135,10 +145,6 @@
             }
         }
 
-        androidInstrumentedTest {
-            dependsOn(androidUnitTest)
-        }
-
         if (enableNative) {
             nativeMain {
                 dependsOn(commonMain)
diff --git a/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/Actual.jvm.kt b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/Actual.jvm.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/Actual.jvm.kt
rename to datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/Actual.jvm.kt
diff --git a/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/DataStoreFactory.jvm.kt b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/DataStoreFactory.jvm.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/DataStoreFactory.jvm.kt
rename to datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/DataStoreFactory.jvm.kt
diff --git a/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/FileStorage.kt b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/FileStorage.kt
new file mode 100644
index 0000000..275650a
--- /dev/null
+++ b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/FileStorage.kt
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.datastore.core
+
+import androidx.annotation.GuardedBy
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileNotFoundException
+import java.io.FileOutputStream
+import java.io.IOException
+import java.util.concurrent.atomic.AtomicBoolean
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+
+/**
+ * The Java IO File version of the Storage<T> interface. Is able to read and write [T] to a given
+ * file location.
+ *
+ * @param serializer The serializer that can write [T] to and from a byte array.
+ * @param coordinatorProducer The producer to provide [InterProcessCoordinator] that coordinates IO
+ * operations across processes if needed. By default it provides single process coordinator, which
+ * doesn't support cross process use cases.
+ * @param produceFile The file producer that returns the file that will be read and written.
+ */
+class FileStorage<T>(
+    private val serializer: Serializer<T>,
+    private val coordinatorProducer: (File) -> InterProcessCoordinator = {
+        createSingleProcessCoordinator(it)
+    },
+    private val produceFile: () -> File
+) : Storage<T> {
+
+    override fun createConnection(): StorageConnection<T> {
+        val file = produceFile().canonicalFile
+
+        synchronized(activeFilesLock) {
+            val path = file.absolutePath
+            check(!activeFiles.contains(path)) {
+                "There are multiple DataStores active for the same file: $path. You should " +
+                    "either maintain your DataStore as a singleton or confirm that there is " +
+                    "no two DataStore's active on the same file (by confirming that the scope" +
+                    " is cancelled)."
+            }
+            activeFiles.add(path)
+        }
+
+        return FileStorageConnection(file, serializer, coordinatorProducer(file)) {
+            synchronized(activeFilesLock) {
+                activeFiles.remove(file.absolutePath)
+            }
+        }
+    }
+
+    internal companion object {
+        /**
+         * Active files should contain the absolute path for which there are currently active
+         * DataStores. A DataStore is active until the scope it was created with has been
+         * cancelled. Files aren't added to this list until the first read/write because the file
+         * path is computed asynchronously.
+         */
+        @GuardedBy("activeFilesLock")
+        internal val activeFiles = mutableSetOf<String>()
+
+        internal val activeFilesLock = Any()
+    }
+}
+
+internal class FileStorageConnection<T>(
+    private val file: File,
+    private val serializer: Serializer<T>,
+    override val coordinator: InterProcessCoordinator,
+    private val onClose: () -> Unit
+) : StorageConnection<T> {
+
+    private val closed = AtomicBoolean(false)
+    // TODO:(b/233402915) support multiple readers
+    private val transactionMutex = Mutex()
+
+    override suspend fun <R> readScope(
+        block: suspend ReadScope<T>.(locked: Boolean) -> R
+    ): R {
+        checkNotClosed()
+
+        val lock = transactionMutex.tryLock()
+        try {
+            return FileReadScope(file, serializer).use {
+                block(it, lock)
+            }
+        } finally {
+            if (lock) {
+                transactionMutex.unlock()
+            }
+        }
+    }
+
+    override suspend fun writeScope(block: suspend WriteScope<T>.() -> Unit) {
+        checkNotClosed()
+        file.createParentDirectories()
+
+        transactionMutex.withLock {
+            val scratchFile = File(file.absolutePath + ".tmp")
+            try {
+                FileWriteScope(scratchFile, serializer).use {
+                    block(it)
+                }
+                if (scratchFile.exists() && !scratchFile.renameTo(file)) {
+                    throw IOException(
+                        "Unable to rename $scratchFile. " +
+                        "This likely means that there are multiple instances of DataStore " +
+                        "for this file. Ensure that you are only creating a single instance of " +
+                        "datastore for this file."
+                    )
+                }
+            } catch (ex: IOException) {
+                if (scratchFile.exists()) {
+                    scratchFile.delete() // Swallow failure to delete
+                }
+                throw ex
+            }
+        }
+    }
+
+    public override fun close() {
+        closed.set(true)
+        onClose()
+    }
+
+    private fun checkNotClosed() {
+        check(!closed.get()) { "StorageConnection has already been disposed." }
+    }
+
+    private fun File.createParentDirectories() {
+        val parent: File? = canonicalFile.parentFile
+
+        parent?.let {
+            it.mkdirs()
+            if (!it.isDirectory) {
+                throw IOException("Unable to create parent directories of $this")
+            }
+        }
+    }
+}
+
+internal open class FileReadScope<T>(
+    protected val file: File,
+    protected val serializer: Serializer<T>
+) : ReadScope<T> {
+
+    private val closed = AtomicBoolean(false)
+
+    override suspend fun readData(): T {
+        checkNotClosed()
+        return try {
+            FileInputStream(file).use { stream ->
+                serializer.readFrom(stream)
+            }
+        } catch (ex: FileNotFoundException) {
+            if (file.exists()) {
+                // Re-read to prevent throwing from a race condition where the file is created by
+                // another process after the initial read attempt but before `file.exists()` is
+                // called. Otherwise file exists but we can't read it; throw FileNotFoundException
+                // because something is wrong.
+                return FileInputStream(file).use { stream ->
+                    serializer.readFrom(stream)
+                }
+            }
+            return serializer.defaultValue
+        }
+    }
+
+    override fun close() {
+        closed.set(true)
+    }
+    protected fun checkNotClosed() {
+        check(!closed.get()) { "This scope has already been closed." }
+    }
+}
+
+internal class FileWriteScope<T>(file: File, serializer: Serializer<T>) :
+    FileReadScope<T>(file, serializer), WriteScope<T> {
+
+    override suspend fun writeData(value: T) {
+        checkNotClosed()
+        val fos = FileOutputStream(file)
+        fos.use { stream ->
+            serializer.writeTo(value, UncloseableOutputStream(stream))
+            stream.fd.sync()
+            // TODO(b/151635324): fsync the directory, otherwise a badly timed crash could
+            //  result in reverting to a previous state.
+        }
+    }
+}
diff --git a/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/InterProcessCoordinator.jvm.kt b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/InterProcessCoordinator.jvm.kt
new file mode 100644
index 0000000..59c6e57
--- /dev/null
+++ b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/InterProcessCoordinator.jvm.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.datastore.core
+
+import java.io.File
+
+/**
+ * Create a coordinator for single process use cases.
+ *
+ * @param file The canonical file managed by [SingleProcessCoordinator]
+ */
+@Suppress("StreamFiles")
+fun createSingleProcessCoordinator(file: File): InterProcessCoordinator =
+    createSingleProcessCoordinator(file.canonicalFile.absolutePath)
diff --git a/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/Serializer.kt b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/Serializer.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/Serializer.kt
rename to datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/Serializer.kt
diff --git a/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/UncloseableOutputStream.kt b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/UncloseableOutputStream.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/UncloseableOutputStream.kt
rename to datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/UncloseableOutputStream.kt
diff --git a/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/handlers/NoOpCorruptionHandler.jvm.kt b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/handlers/NoOpCorruptionHandler.jvm.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/handlers/NoOpCorruptionHandler.jvm.kt
rename to datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/handlers/NoOpCorruptionHandler.jvm.kt
diff --git a/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/handlers/ReplaceFileCorruptionHandler.jvm.kt b/datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/handlers/ReplaceFileCorruptionHandler.jvm.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/handlers/ReplaceFileCorruptionHandler.jvm.kt
rename to datastore/datastore-core/src/commonJvmMain/kotlin/androidx/datastore/core/handlers/ReplaceFileCorruptionHandler.jvm.kt
diff --git a/datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/DataStoreFactoryTest.kt b/datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/DataStoreFactoryTest.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/DataStoreFactoryTest.kt
rename to datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/DataStoreFactoryTest.kt
diff --git a/datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/FileStorageTest.kt b/datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/FileStorageTest.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/FileStorageTest.kt
rename to datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/FileStorageTest.kt
diff --git a/datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/JvmTests.kt b/datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/JvmTests.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/JvmTests.kt
rename to datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/JvmTests.kt
diff --git a/datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/SimpleActorTest.kt b/datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/SimpleActorTest.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/SimpleActorTest.kt
rename to datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/SimpleActorTest.kt
diff --git a/datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/SingleProcessDataStoreStressTest.kt b/datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/SingleProcessDataStoreStressTest.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/SingleProcessDataStoreStressTest.kt
rename to datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/SingleProcessDataStoreStressTest.kt
diff --git a/datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/handlers/ReplaceFileCorruptionHandlerTest.kt b/datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/handlers/ReplaceFileCorruptionHandlerTest.kt
similarity index 100%
rename from datastore/datastore-core/src/jvmTest/kotlin/androidx/datastore/core/handlers/ReplaceFileCorruptionHandlerTest.kt
rename to datastore/datastore-core/src/commonJvmTest/kotlin/androidx/datastore/core/handlers/ReplaceFileCorruptionHandlerTest.kt
diff --git a/datastore/datastore-core/src/commonMain/kotlin/androidx/datastore/core/InterProcessCoordinator.kt b/datastore/datastore-core/src/commonMain/kotlin/androidx/datastore/core/InterProcessCoordinator.kt
index f23f7ed..6f04937 100644
--- a/datastore/datastore-core/src/commonMain/kotlin/androidx/datastore/core/InterProcessCoordinator.kt
+++ b/datastore/datastore-core/src/commonMain/kotlin/androidx/datastore/core/InterProcessCoordinator.kt
@@ -16,6 +16,7 @@
 
 package androidx.datastore.core
 
+import androidx.annotation.RestrictTo
 import kotlinx.coroutines.flow.Flow
 
 /**
@@ -75,5 +76,9 @@
 
 /**
  * Create a coordinator for single process use cases.
+ *
+ * @param filePath The canonical file path of the file managed by [SingleProcessCoordinator]
  */
-fun createSingleProcessCoordinator(): InterProcessCoordinator = SingleProcessCoordinator()
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+fun createSingleProcessCoordinator(filePath: String): InterProcessCoordinator =
+    SingleProcessCoordinator(filePath)
diff --git a/datastore/datastore-core/src/commonMain/kotlin/androidx/datastore/core/SingleProcessCoordinator.kt b/datastore/datastore-core/src/commonMain/kotlin/androidx/datastore/core/SingleProcessCoordinator.kt
index 83e2072..1fc9295 100644
--- a/datastore/datastore-core/src/commonMain/kotlin/androidx/datastore/core/SingleProcessCoordinator.kt
+++ b/datastore/datastore-core/src/commonMain/kotlin/androidx/datastore/core/SingleProcessCoordinator.kt
@@ -26,7 +26,10 @@
  * SingleProcessCoordinator does coordination within a single process. It is used as the default
  * [InterProcessCoordinator] immplementation unless otherwise specified.
  */
-internal class SingleProcessCoordinator() : InterProcessCoordinator {
+internal class SingleProcessCoordinator(
+    /** The canonical file path of the file managed by [SingleProcessCoordinator]. */
+    private val filePath: String
+) : InterProcessCoordinator {
     private val mutex = Mutex()
     private val version = AtomicInt(0)
 
diff --git a/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/CloseDownstreamOnCloseTest.kt b/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/CloseDownstreamOnCloseTest.kt
index ded8cbc..5ecb216 100644
--- a/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/CloseDownstreamOnCloseTest.kt
+++ b/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/CloseDownstreamOnCloseTest.kt
@@ -39,11 +39,12 @@
 
     @BeforeTest
     fun createDataStore() {
+        val testFile: F = testIO.newTempFile()
         store = testIO.getStore(
             serializerConfig = TestingSerializerConfig(),
             scope = datastoreScope,
-            coordinatorProducer = { createSingleProcessCoordinator() }
-        ) { testIO.newTempFile() }
+            coordinatorProducer = { createSingleProcessCoordinator(testFile.path()) }
+        ) { testFile }
     }
 
     @Test
diff --git a/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/DataMigrationInitializerTest.kt b/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/DataMigrationInitializerTest.kt
index 4ac3c9e..f3a622b 100644
--- a/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/DataMigrationInitializerTest.kt
+++ b/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/DataMigrationInitializerTest.kt
@@ -39,11 +39,13 @@
     private lateinit var storage: Storage<Byte>
     private lateinit var testScope: TestScope
     private lateinit var dataStoreScope: TestScope
+    protected lateinit var testFile: F
 
     @BeforeTest
     fun setUp() {
         testScope = TestScope(UnconfinedTestDispatcher())
         dataStoreScope = TestScope(UnconfinedTestDispatcher())
+        testFile = testIO.newTempFile()
     }
 
     fun doTest(test: suspend TestScope.() -> Unit) {
@@ -142,10 +144,12 @@
             cleanUpFunction = { cleanUpFinished.complete(Unit) }
         )
 
+        val testFile = testIO.newTempFile()
+
         val storage = testIO.getStorage(
             TestingSerializerConfig(failingWrite = true),
-            { createSingleProcessCoordinator() }
-        ) { testIO.newTempFile() }
+            { createSingleProcessCoordinator(testFile.path()) }
+        ) { testFile }
         val store = newDataStore(
             initTasksList = listOf(
                 DataMigrationInitializer.getInitializer(listOf(noOpMigration))
@@ -196,7 +200,8 @@
         initTasksList: List<suspend (api: InitializerApi<Byte>) -> Unit> = listOf(),
         storage: Storage<Byte> = testIO.getStorage(
             TestingSerializerConfig(),
-            { createSingleProcessCoordinator() }
+            { createSingleProcessCoordinator(testFile.path()) },
+            { testFile }
         )
     ): DataStore<Byte> {
         return DataStoreImpl(
diff --git a/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/SingleProcessDataStoreTest.kt b/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/SingleProcessDataStoreTest.kt
index 56dd04c..ed9fd38 100644
--- a/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/SingleProcessDataStoreTest.kt
+++ b/datastore/datastore-core/src/commonTest/kotlin/androidx/datastore/core/SingleProcessDataStoreTest.kt
@@ -67,7 +67,7 @@
         store = testIO.getStore(
             serializerConfig,
             dataStoreScope,
-            { createSingleProcessCoordinator() }
+            { createSingleProcessCoordinator(testFile.path()) }
         ) { testFile }
     }
 
@@ -103,7 +103,7 @@
         val store = testIO.getStore(
             serializerConfig,
             storeScope,
-            { createSingleProcessCoordinator() }) { testFile }
+            { createSingleProcessCoordinator(testFile.path()) }) { testFile }
 
         val collection = async {
             store.data.take(2).collect {
@@ -223,7 +223,7 @@
         val newStore = testIO.getStore(
             serializerConfig,
             dataStoreScope,
-            { createSingleProcessCoordinator() },
+            { createSingleProcessCoordinator(testFile.path()) },
             fileProducer
         )
 
@@ -993,7 +993,10 @@
         corruptionHandler: CorruptionHandler<Byte> = NoOpCorruptionHandler()
     ): DataStore<Byte> {
         return DataStoreImpl(
-            testIO.getStorage(serializerConfig, { createSingleProcessCoordinator() }) { file },
+            testIO.getStorage(
+                serializerConfig,
+                { createSingleProcessCoordinator(file.path()) }
+            ) { file },
             scope = scope,
             initTasksList = initTasksList,
             corruptionHandler = corruptionHandler
diff --git a/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/FileStorage.kt b/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/FileStorage.kt
deleted file mode 100644
index 34dea2f..0000000
--- a/datastore/datastore-core/src/jvmMain/kotlin/androidx/datastore/core/FileStorage.kt
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.datastore.core
-
-import androidx.annotation.GuardedBy
-import java.io.File
-import java.io.FileInputStream
-import java.io.FileNotFoundException
-import java.io.FileOutputStream
-import java.io.IOException
-import java.util.concurrent.atomic.AtomicBoolean
-import kotlinx.coroutines.sync.Mutex
-import kotlinx.coroutines.sync.withLock
-
-/**
- * The Java IO File version of the Storage<T> interface. Is able to read and write [T] to a given
- * file location.
- *
- * @param serializer The serializer that can write [T] to and from a byte array.
- * @param coordinatorProducer The producer to provide [InterProcessCoordinator] that coordinates IO
- * operations across processes if needed. By default it provides single process coordinator, which
- * doesn't support cross process use cases.
- * @param produceFile The file producer that returns the file that will be read and written.
- */
-class FileStorage<T>(
-    private val serializer: Serializer<T>,
-    private val coordinatorProducer: (File) -> InterProcessCoordinator = {
-        SingleProcessCoordinator()
-    },
-    private val produceFile: () -> File
-) : Storage<T> {
-
-    override fun createConnection(): StorageConnection<T> {
-        val file = produceFile().canonicalFile
-
-        synchronized(activeFilesLock) {
-            val path = file.absolutePath
-            check(!activeFiles.contains(path)) {
-                "There are multiple DataStores active for the same file: $path. You should " +
-                    "either maintain your DataStore as a singleton or confirm that there is " +
-                    "no two DataStore's active on the same file (by confirming that the scope" +
-                    " is cancelled)."
-            }
-            activeFiles.add(path)
-        }
-
-        return FileStorageConnection(file, serializer, coordinatorProducer(file)) {
-            synchronized(activeFilesLock) {
-                activeFiles.remove(file.absolutePath)
-            }
-        }
-    }
-
-    internal companion object {
-        /**
-         * Active files should contain the absolute path for which there are currently active
-         * DataStores. A DataStore is active until the scope it was created with has been
-         * cancelled. Files aren't added to this list until the first read/write because the file
-         * path is computed asynchronously.
-         */
-        @GuardedBy("activeFilesLock")
-        internal val activeFiles = mutableSetOf<String>()
-
-        internal val activeFilesLock = Any()
-    }
-}
-
-internal class FileStorageConnection<T>(
-    private val file: File,
-    private val serializer: Serializer<T>,
-    override val coordinator: InterProcessCoordinator,
-    private val onClose: () -> Unit
-) : StorageConnection<T> {
-
-    private val closed = AtomicBoolean(false)
-    // TODO:(b/233402915) support multiple readers
-    private val transactionMutex = Mutex()
-
-    override suspend fun <R> readScope(
-        block: suspend ReadScope<T>.(locked: Boolean) -> R
-    ): R {
-        checkNotClosed()
-
-        val lock = transactionMutex.tryLock()
-        try {
-            return FileReadScope(file, serializer).use {
-                block(it, lock)
-            }
-        } finally {
-            if (lock) {
-                transactionMutex.unlock()
-            }
-        }
-    }
-
-    override suspend fun writeScope(block: suspend WriteScope<T>.() -> Unit) {
-        checkNotClosed()
-        file.createParentDirectories()
-
-        transactionMutex.withLock {
-            val scratchFile = File(file.absolutePath + ".tmp")
-            try {
-                FileWriteScope(scratchFile, serializer).use {
-                    block(it)
-                }
-                if (scratchFile.exists() && !scratchFile.renameTo(file)) {
-                    throw IOException(
-                        "Unable to rename $scratchFile. " +
-                        "This likely means that there are multiple instances of DataStore " +
-                        "for this file. Ensure that you are only creating a single instance of " +
-                        "datastore for this file."
-                    )
-                }
-            } catch (ex: IOException) {
-                if (scratchFile.exists()) {
-                    scratchFile.delete() // Swallow failure to delete
-                }
-                throw ex
-            }
-        }
-    }
-
-    public override fun close() {
-        closed.set(true)
-        onClose()
-    }
-
-    private fun checkNotClosed() {
-        check(!closed.get()) { "StorageConnection has already been disposed." }
-    }
-
-    private fun File.createParentDirectories() {
-        val parent: File? = canonicalFile.parentFile
-
-        parent?.let {
-            it.mkdirs()
-            if (!it.isDirectory) {
-                throw IOException("Unable to create parent directories of $this")
-            }
-        }
-    }
-}
-
-internal open class FileReadScope<T>(
-    protected val file: File,
-    protected val serializer: Serializer<T>
-) : ReadScope<T> {
-
-    private val closed = AtomicBoolean(false)
-
-    override suspend fun readData(): T {
-        checkNotClosed()
-        return try {
-            FileInputStream(file).use { stream ->
-                serializer.readFrom(stream)
-            }
-        } catch (ex: FileNotFoundException) {
-            if (file.exists()) {
-                // Re-read to prevent throwing from a race condition where the file is created by
-                // another process after the initial read attempt but before `file.exists()` is
-                // called. Otherwise file exists but we can't read it; throw FileNotFoundException
-                // because something is wrong.
-                return FileInputStream(file).use { stream ->
-                    serializer.readFrom(stream)
-                }
-            }
-            return serializer.defaultValue
-        }
-    }
-
-    override fun close() {
-        closed.set(true)
-    }
-    protected fun checkNotClosed() {
-        check(!closed.get()) { "This scope has already been closed." }
-    }
-}
-
-internal class FileWriteScope<T>(file: File, serializer: Serializer<T>) :
-    FileReadScope<T>(file, serializer), WriteScope<T> {
-
-    override suspend fun writeData(value: T) {
-        checkNotClosed()
-        val fos = FileOutputStream(file)
-        fos.use { stream ->
-            serializer.writeTo(value, UncloseableOutputStream(stream))
-            stream.fd.sync()
-            // TODO(b/151635324): fsync the directory, otherwise a badly timed crash could
-            //  result in reverting to a previous state.
-        }
-    }
-}
diff --git a/datastore/datastore-preferences/build.gradle b/datastore/datastore-preferences/build.gradle
index e8cbf29..e0295f2c 100644
--- a/datastore/datastore-preferences/build.gradle
+++ b/datastore/datastore-preferences/build.gradle
@@ -51,24 +51,30 @@
                 implementation(libs.kotlinCoroutinesTest)
             }
         }
-        jvmMain {
+        commonJvmMain {
             dependsOn(commonMain)
         }
-        jvmTest {
+        commonJvmTest {
             dependsOn(commonTest)
             dependencies {
                 implementation(libs.junit)
                 implementation(libs.kotlinTest)
             }
         }
+        jvmMain {
+            dependsOn(commonJvmMain)
+        }
+        jvmTest {
+            dependsOn(commonJvmTest)
+        }
         androidMain {
-            dependsOn(jvmMain)
+            dependsOn(commonJvmMain)
         }
         androidUnitTest {
-            dependsOn(jvmTest)
+            dependsOn(commonJvmTest)
         }
         androidInstrumentedTest {
-            dependsOn(androidUnitTest)
+            dependsOn(commonJvmTest)
             dependencies {
                 implementation(libs.testRunner)
                 implementation(libs.testCore)
diff --git a/datastore/datastore/api/api_lint.ignore b/datastore/datastore/api/api_lint.ignore
index 22f9203..18fc7f7 100644
--- a/datastore/datastore/api/api_lint.ignore
+++ b/datastore/datastore/api/api_lint.ignore
@@ -1,10 +1,4 @@
 // Baseline format: 1.0
-InvalidNullabilityOverride: androidx.datastore.migrations.SharedPreferencesMigration#migrate(T, kotlin.coroutines.Continuation<? super T>):
-    Invalid nullability on method `migrate` return. Overrides of unannotated super method cannot be Nullable.
-InvalidNullabilityOverride: androidx.datastore.migrations.SharedPreferencesMigration#shouldMigrate(T, kotlin.coroutines.Continuation<? super java.lang.Boolean>):
-    Invalid nullability on method `shouldMigrate` return. Overrides of unannotated super method cannot be Nullable.
-
-
 MissingJvmstatic: androidx.datastore.migrations.SharedPreferencesView#getString(String, String):
     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.datastore.migrations.SharedPreferencesView#getStringSet(String, java.util.Set<java.lang.String>):
diff --git a/datastore/datastore/build.gradle b/datastore/datastore/build.gradle
index 0eaed8a..1170050 100644
--- a/datastore/datastore/build.gradle
+++ b/datastore/datastore/build.gradle
@@ -57,11 +57,10 @@
                 implementation(project(":internal-testutils-datastore"))
             }
         }
-        jvmMain {
+        commonJvmMain {
             dependsOn(commonMain)
-
         }
-        jvmTest {
+        commonJvmTest {
             dependsOn(commonTest)
             dependencies {
                 implementation(libs.kotlinTest)
@@ -69,14 +68,20 @@
                 implementation(project(":internal-testutils-datastore"))
             }
         }
+        jvmMain {
+            dependsOn(commonJvmMain)
+        }
+        jvmTest {
+            dependsOn(commonJvmTest)
+        }
         androidMain {
-            dependsOn(jvmMain)
+            dependsOn(commonJvmMain)
             dependencies {
                 implementation(libs.okio)
             }
         }
         androidInstrumentedTest {
-            dependsOn(jvmTest)
+            dependsOn(commonJvmTest)
             dependencies {
                 implementation(libs.junit)
                 implementation(libs.truth)
diff --git a/development/build_log_simplifier/message-flakes.ignore b/development/build_log_simplifier/message-flakes.ignore
index eb5d676..76e946e 100644
--- a/development/build_log_simplifier/message-flakes.ignore
+++ b/development/build_log_simplifier/message-flakes.ignore
@@ -147,8 +147,6 @@
 Failed to compile with Kotlin daemon: java\.lang\.RuntimeException: Could not connect to Kotlin compile daemon
 Using fallback strategy: Compile without Kotlin daemon
 Try \./gradlew \-\-stop if this issue persists\.
-# b/ 279739438
-w\: Detected multiple Kotlin daemon sessions at kotlin/sessions
 # > Task :compose:ui:ui:compileReleaseKotlinAndroid
 e: Daemon compilation failed: Could not connect to Kotlin compile daemon
 java\.lang\.RuntimeException: Could not connect to Kotlin compile daemon
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index 2d303ae..7780842 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -484,6 +484,7 @@
 WARN: .*\/unzippedMultiplatformSources\/commonMain\/androidx\/paging\/compose\/LazyPagingItems\.kt:[0-9]+ Failed to resolve See PagingSource\.invalidate in DFunction refresh\. Did you mean PagingSource#invalidate\?
 WARN: .*\/unzippedMultiplatformSources\/desktopMain\/androidx\/compose\/material\/DesktopMenu\.desktop\.kt:[0-9]+ Missing @param tag for parameter `content` in DFunction DropdownMenuItem
 WARN: .*\/unzippedMultiplatformSources\/jvmMain\/androidx\/datastore\/core\/Serializer\.kt:[0-9]+ Missing @param tag for parameter `output` in DFunction writeTo
+WARN: .*\/unzippedMultiplatformSources\/commonJvmMain\/androidx\/datastore\/core\/Serializer\.kt:[0-9]+ Missing @param tag for parameter `output` in DFunction writeTo
 WARN: .*\/unzippedMultiplatformSources\/nonJvmMain\/androidx\/annotation\/RestrictTo\.nonJvm\.kt:UnknownLine Link does not resolve for @throws kotlin\.IllegalArgumentException in DFunction valueOf\. Is it from a package that the containing file does not import\? Are docs inherited by an un-documented override function, but the exception class is not in scope in the inheriting class\? The general fix for these is to fully qualify the exception name, e\.g\. `@throws java\.io\.IOException under some conditions`\.
 WARN: File location could not be determined\. Failed to resolve See <a href="https:\/\/developer\.android\.com\/training\/transitions">Transition API Guide<\/a> in DPackage androidx\.transition
 # > Task :compose:ui:ui-tooling:processDebugAndroidTestManifest
diff --git a/development/importMaven/src/main/kotlin/androidx/build/importMaven/ImportVersionCatalog.kt b/development/importMaven/src/main/kotlin/androidx/build/importMaven/ImportVersionCatalog.kt
index 3789c53..43fc64a 100644
--- a/development/importMaven/src/main/kotlin/androidx/build/importMaven/ImportVersionCatalog.kt
+++ b/development/importMaven/src/main/kotlin/androidx/build/importMaven/ImportVersionCatalog.kt
@@ -16,6 +16,7 @@
 
 package androidx.build.importMaven
 
+import java.util.function.Supplier
 import okio.Path
 import org.gradle.api.artifacts.Configuration
 import org.gradle.api.internal.artifacts.ImmutableVersionConstraint
@@ -48,7 +49,7 @@
             Interners.newStrongInterner<String>(),
             Interners.newStrongInterner< ImmutableVersionConstraint>(),
             project.objects,
-            { error("Not supported") },
+            Supplier { error("Not supported") },
             configurations
         )
         TomlCatalogFileParser.parse(
diff --git a/development/importMaven/src/main/kotlin/androidx/build/importMaven/KonanPrebuiltsDownloader.kt b/development/importMaven/src/main/kotlin/androidx/build/importMaven/KonanPrebuiltsDownloader.kt
index b7c05eb..e0df8ae 100644
--- a/development/importMaven/src/main/kotlin/androidx/build/importMaven/KonanPrebuiltsDownloader.kt
+++ b/development/importMaven/src/main/kotlin/androidx/build/importMaven/KonanPrebuiltsDownloader.kt
@@ -29,6 +29,9 @@
 import okio.FileSystem
 import okio.Path
 import org.apache.logging.log4j.kotlin.logger
+import org.gradle.api.Project
+import org.jetbrains.kotlin.gradle.plugin.KotlinApiPlugin
+import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper
 import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader
 import org.jetbrains.kotlin.konan.properties.resolvablePropertyList
 import org.jetbrains.kotlin.konan.properties.resolvablePropertyString
@@ -55,6 +58,8 @@
         compilerVersion: String
     ) {
         val project = ProjectService.createProject()
+        project.initializeKotlin()
+
         val compiler = NativeCompilerDownloader(
             project = project,
             compilerVersion = compilerVersion
@@ -75,6 +80,14 @@
         downloadNativeCompiler(compilerVersion)
     }
 
+    /**
+     * NativeCompilerDownloader expects Kotlin plugin to be applied before the download starts.
+     * As this class is simulating the same environment, apply the Kotlin plugin manually.
+     */
+    private fun Project.initializeKotlin() {
+        project.pluginManager.apply(KotlinPluginWrapper::class.java)
+    }
+
     private fun downloadNativeCompiler(
         compilerVersion: String
     ) {
diff --git a/documentfile/documentfile/lint-baseline.xml b/documentfile/documentfile/lint-baseline.xml
new file mode 100644
index 0000000..523b7bb
--- /dev/null
+++ b/documentfile/documentfile/lint-baseline.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/documentfile/provider/DocumentFile.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/documentfile/provider/DocumentsContractApi19.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/documentfile/provider/SingleDocumentFile.java"/>
+    </issue>
+
+</issues>
diff --git a/drawerlayout/drawerlayout/api/api_lint.ignore b/drawerlayout/drawerlayout/api/api_lint.ignore
index 69b398e..e9d5461 100644
--- a/drawerlayout/drawerlayout/api/api_lint.ignore
+++ b/drawerlayout/drawerlayout/api/api_lint.ignore
@@ -17,8 +17,6 @@
     Missing nullability on parameter `p` in method `checkLayoutParams`
 MissingNullability: androidx.drawerlayout.widget.DrawerLayout#dispatchGenericMotionEvent(android.view.MotionEvent) parameter #0:
     Missing nullability on parameter `event` in method `dispatchGenericMotionEvent`
-MissingNullability: androidx.drawerlayout.widget.DrawerLayout#drawChild(android.graphics.Canvas, android.view.View, long) parameter #0:
-    Missing nullability on parameter `canvas` in method `drawChild`
 MissingNullability: androidx.drawerlayout.widget.DrawerLayout#drawChild(android.graphics.Canvas, android.view.View, long) parameter #1:
     Missing nullability on parameter `child` in method `drawChild`
 MissingNullability: androidx.drawerlayout.widget.DrawerLayout#generateDefaultLayoutParams():
@@ -31,8 +29,6 @@
     Missing nullability on method `generateLayoutParams` return
 MissingNullability: androidx.drawerlayout.widget.DrawerLayout#generateLayoutParams(android.view.ViewGroup.LayoutParams) parameter #0:
     Missing nullability on parameter `p` in method `generateLayoutParams`
-MissingNullability: androidx.drawerlayout.widget.DrawerLayout#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `c` in method `onDraw`
 MissingNullability: androidx.drawerlayout.widget.DrawerLayout#onInterceptTouchEvent(android.view.MotionEvent) parameter #0:
     Missing nullability on parameter `ev` in method `onInterceptTouchEvent`
 MissingNullability: androidx.drawerlayout.widget.DrawerLayout#onKeyDown(int, android.view.KeyEvent) parameter #1:
@@ -49,6 +45,10 @@
     Missing nullability on parameter `dest` in method `writeToParcel`
 
 
+NotCloseable: androidx.drawerlayout.widget.DrawerLayout:
+    Classes that release resources (close()) should implement AutoCloseable and CloseGuard: class androidx.drawerlayout.widget.DrawerLayout
+
+
 ParcelCreator: androidx.drawerlayout.widget.DrawerLayout.SavedState:
     Parcelable requires `public int describeContents()`; missing in androidx.drawerlayout.widget.DrawerLayout.SavedState
 
diff --git a/drawerlayout/drawerlayout/lint-baseline.xml b/drawerlayout/drawerlayout/lint-baseline.xml
new file mode 100644
index 0000000..86a0e10
--- /dev/null
+++ b/drawerlayout/drawerlayout/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    static final boolean CAN_HIDE_DESCENDANTS = Build.VERSION.SDK_INT >= 19;"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/drawerlayout/widget/DrawerLayout.java"/>
+    </issue>
+
+</issues>
diff --git a/dynamicanimation/dynamicanimation/lint-baseline.xml b/dynamicanimation/dynamicanimation/lint-baseline.xml
index 63482d4..138871e 100644
--- a/dynamicanimation/dynamicanimation/lint-baseline.xml
+++ b/dynamicanimation/dynamicanimation/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -47,6 +47,24 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/dynamicanimation/animation/AnimationHandler.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/dynamicanimation/animation/AnimationHandler.java"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public T addEndListener(OnAnimationEndListener listener) {"
diff --git a/emoji/emoji-bundled/lint-baseline.xml b/emoji/emoji-bundled/lint-baseline.xml
new file mode 100644
index 0000000..90a60bc
--- /dev/null
+++ b/emoji/emoji-bundled/lint-baseline.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/bundled/BundledEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/bundled/BundledEmojiCompatConfig.java"/>
+    </issue>
+
+</issues>
diff --git a/emoji/emoji/lint-baseline.xml b/emoji/emoji/lint-baseline.xml
index 4555808..8980a86 100644
--- a/emoji/emoji/lint-baseline.xml
+++ b/emoji/emoji/lint-baseline.xml
@@ -1,320 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `DefaultGlyphChecker`"
-        errorLine1="        GlyphChecker mGlyphChecker = new EmojiProcessor.DefaultGlyphChecker();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/text/EmojiCompat.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiMetadata`"
-        errorLine1="        final EmojiMetadata metadata = mock(EmojiMetadata.class);"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiEditableFactoryTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `TypefaceEmojiSpan`"
-        errorLine1="        final EmojiSpan span = new TypefaceEmojiSpan(metadata);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiEditableFactoryTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="        final EmojiSpan[] spans = editable.getSpans(0, 1, EmojiSpan.class);"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiEditableFactoryTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 15 (current min is 14): `android.view.View#hasOnClickListeners`"
-        errorLine1="        assertTrue(extractButton.hasOnClickListeners());"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiExtractTextLayoutTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 15 (current min is 14): `android.view.View#hasOnClickListeners`"
-        errorLine1="        assertFalse(extractButton.hasOnClickListeners());"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiExtractTextLayoutTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `EmojiInputFilter`"
-        errorLine1="        mInputFilter = new EmojiInputFilter(textView);"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `filter`"
-        errorLine1="        assertNull(mInputFilter.filter(null, 0, 1, null, 0, 1));"
-        errorLine2="                                ~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `filter`"
-        errorLine1="        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `filter`"
-        errorLine1="        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `filter`"
-        errorLine1="        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `filter`"
-        errorLine1="        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `filter`"
-        errorLine1="        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiInputFilterTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="            mSpans = ((Spanned) charSequence).getSpans(0, charSequence.length(), EmojiSpan.class);"
-        errorLine2="                                                                                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/util/EmojiMatcher.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="            mSpans = ((Spanned) charSequence).getSpans(0, charSequence.length(), EmojiSpan.class);"
-        errorLine2="                                                                                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/util/EmojiMatcher.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="            final EmojiSpan[] spans = spanned.getSpans(0, charSequence.length(), EmojiSpan.class);"
-        errorLine2="                                                                                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/util/EmojiMatcher.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getId`"
-        errorLine1="                    if (mResId == spans[index].getId()) {"
-        errorLine2="                                               ~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/util/EmojiMatcher.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getId`"
-        errorLine1="                    if (mResId == -1 || mResId == spans[index].getId()) {"
-        errorLine2="                                                               ~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/util/EmojiMatcher.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `EmojiTransformationMethod`"
-        errorLine1="        mTransformationMethod = new EmojiTransformationMethod(mWrappedTransformationMethod);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getTransformation`"
-        errorLine1="        assertNull(mTransformationMethod.getTransformation(null, mView));"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getTransformation`"
-        errorLine1="        mTransformationMethod.getTransformation(&quot;&quot;, null);"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `EmojiTransformationMethod`"
-        errorLine1="        mTransformationMethod = new EmojiTransformationMethod(null);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getTransformation`"
-        errorLine1="        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getTransformation`"
-        errorLine1="        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getTransformation`"
-        errorLine1="        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getTransformation`"
-        errorLine1="        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `getTransformation`"
-        errorLine1="        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/EmojiTransformationMethodTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="            return span instanceof EmojiSpan;"
-        errorLine2="                                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/SpannableBuilder.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="        final EmojiSpan span = mock(EmojiSpan.class);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/SpannableBuilderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="        EmojiSpan[] spans = spannable.getSpans(0, spannable.length(), EmojiSpan.class);"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/SpannableBuilderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="        final EmojiSpan span = mock(EmojiSpan.class);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/SpannableBuilderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="        EmojiSpan[] spans = spannable.getSpans(0, spannable.length(), EmojiSpan.class);"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/widget/SpannableBuilderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `MetadataRepo`"
-        errorLine1="                            loaderCallback.onLoaded(new MetadataRepo());"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/text/TestConfigBuilder.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `create`"
-        errorLine1="                            sMetadataRepo = MetadataRepo.create(assetManager, FONT_FILE);"
-        errorLine2="                                                         ~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/text/TestConfigBuilder.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `create`"
-        errorLine1="                    mMetadataRepo = MetadataRepo.create(assetManager, FONT_FILE);"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/emoji/text/TestConfigBuilder.java"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="ClassVerificationFailure"
@@ -371,6 +56,213 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        mHelper = Build.VERSION.SDK_INT &lt; 19 ? new CompatInternal(this) : new CompatInternal19("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        mHelper = Build.VERSION.SDK_INT >= 19 ? new HelperInternal19(editText)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiEditTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiEditTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiInputConnection.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiInputFilter.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiKeyListener.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiMetadata.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiProcessor.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiSpan.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        mHelper = Build.VERSION.SDK_INT >= 19 ? new HelperInternal19(textView)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiTextViewHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiTextViewHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiTextWatcher.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/FontRequestEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/FontRequestEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/FontRequestEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/MetadataListReader.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/MetadataRepo.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/TypefaceEmojiSpan.java"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="The getter return type (`int`) and setter parameter type (`boolean`) getter and setter methods for property `hasGlyph` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public int getHasGlyph() {"
diff --git a/emoji2/emoji2-bundled/lint-baseline.xml b/emoji2/emoji2-bundled/lint-baseline.xml
index 594dde4..575575b 100644
--- a/emoji2/emoji2-bundled/lint-baseline.xml
+++ b/emoji2/emoji2-bundled/lint-baseline.xml
@@ -1,13 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `create`"
-        errorLine1="                            sMetadataRepo = MetadataRepo.create(assetManager, FONT_FILE);"
-        errorLine2="                                                         ~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
-            file="src/androidTest/java/androidx/emoji2/bundled/TestConfigBuilder.java"/>
+            file="src/main/java/androidx/emoji2/bundled/BundledEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/bundled/BundledEmojiCompatConfig.java"/>
     </issue>
 
 </issues>
diff --git a/emoji2/emoji2-views-helper/lint-baseline.xml b/emoji2/emoji2-views-helper/lint-baseline.xml
new file mode 100644
index 0000000..d43ba3e
--- /dev/null
+++ b/emoji2/emoji2-views-helper/lint-baseline.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiEditTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiEditTextHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiInputConnection.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiInputFilter.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiInputFilter.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiKeyListener.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiTextViewHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiTextViewHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiTextViewHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiTextWatcher.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiTextWatcher.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/viewsintegration/EmojiTransformationMethod.java"/>
+    </issue>
+
+</issues>
diff --git a/emoji2/emoji2/lint-baseline.xml b/emoji2/emoji2/lint-baseline.xml
index 8f8dcf7..105508c 100644
--- a/emoji2/emoji2/lint-baseline.xml
+++ b/emoji2/emoji2/lint-baseline.xml
@@ -1,13 +1,220 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
-        id="NewApi"
-        message="Class requires API level 19 (current min is 14): `EmojiSpan`"
-        errorLine1="            return span instanceof EmojiSpan;"
-        errorLine2="                                   ~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            } else if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"/>
+            file="src/main/java/androidx/emoji2/text/DefaultEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/DefaultEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        mHelper = Build.VERSION.SDK_INT &lt; 19 ? new CompatInternal(this) : new CompatInternal19("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiProcessor.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiProcessor.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/EmojiSpan.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/MetadataListReader.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/MetadataRepo.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/TypefaceEmojiRasterizer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji2/text/TypefaceEmojiSpan.java"/>
     </issue>
 
 </issues>
diff --git a/fragment/fragment-ktx/api/api_lint.ignore b/fragment/fragment-ktx/api/api_lint.ignore
deleted file mode 100644
index e42cfe7..0000000
--- a/fragment/fragment-ktx/api/api_lint.ignore
+++ /dev/null
@@ -1,11 +0,0 @@
-// Baseline format: 1.0
-MissingNullability: androidx.fragment.app.FragmentTransactionKt#add(androidx.fragment.app.FragmentTransaction, String, android.os.Bundle):
-    Missing nullability on method `add` return
-MissingNullability: androidx.fragment.app.FragmentTransactionKt#add(androidx.fragment.app.FragmentTransaction, int, String, android.os.Bundle):
-    Missing nullability on method `add` return
-MissingNullability: androidx.fragment.app.FragmentTransactionKt#replace(androidx.fragment.app.FragmentTransaction, int, String, android.os.Bundle):
-    Missing nullability on method `replace` return
-MissingNullability: androidx.fragment.app.FragmentViewModelLazyKt#activityViewModels(androidx.fragment.app.Fragment, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>):
-    Missing nullability on method `activityViewModels` return
-MissingNullability: androidx.fragment.app.FragmentViewModelLazyKt#viewModels(androidx.fragment.app.Fragment, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStoreOwner>, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>):
-    Missing nullability on method `viewModels` return
diff --git a/fragment/fragment-testing/api/api_lint.ignore b/fragment/fragment-testing/api/api_lint.ignore
deleted file mode 100644
index f0f2d71..0000000
--- a/fragment/fragment-testing/api/api_lint.ignore
+++ /dev/null
@@ -1,9 +0,0 @@
-// Baseline format: 1.0
-MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragment(android.os.Bundle, int, androidx.lifecycle.Lifecycle.State, androidx.fragment.app.FragmentFactory):
-    Missing nullability on method `launchFragment` return
-MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragment(android.os.Bundle, int, androidx.lifecycle.Lifecycle.State, kotlin.jvm.functions.Function0<? extends F>):
-    Missing nullability on method `launchFragment` return
-MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragmentInContainer(android.os.Bundle, int, androidx.lifecycle.Lifecycle.State, androidx.fragment.app.FragmentFactory):
-    Missing nullability on method `launchFragmentInContainer` return
-MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragmentInContainer(android.os.Bundle, int, androidx.lifecycle.Lifecycle.State, kotlin.jvm.functions.Function0<? extends F>):
-    Missing nullability on method `launchFragmentInContainer` return
diff --git a/fragment/fragment/api/api_lint.ignore b/fragment/fragment/api/api_lint.ignore
index c35b358..3a537bf 100644
--- a/fragment/fragment/api/api_lint.ignore
+++ b/fragment/fragment/api/api_lint.ignore
@@ -35,10 +35,6 @@
     Invalid nullability on parameter `child` in method `addView`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.fragment.app.FragmentContainerView#dispatchApplyWindowInsets(android.view.WindowInsets) parameter #0:
     Invalid nullability on parameter `insets` in method `dispatchApplyWindowInsets`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.fragment.app.FragmentContainerView#dispatchDraw(android.graphics.Canvas) parameter #0:
-    Invalid nullability on parameter `canvas` in method `dispatchDraw`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.fragment.app.FragmentContainerView#drawChild(android.graphics.Canvas, android.view.View, long) parameter #0:
-    Invalid nullability on parameter `canvas` in method `drawChild`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.fragment.app.FragmentContainerView#drawChild(android.graphics.Canvas, android.view.View, long) parameter #1:
     Invalid nullability on parameter `child` in method `drawChild`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.fragment.app.FragmentContainerView#endViewTransition(android.view.View) parameter #0:
@@ -55,20 +51,8 @@
     Invalid nullability on parameter `view` in method `startViewTransition`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 
 
-MissingNullability: androidx.fragment.app.Fragment#startActivity(android.content.Intent) parameter #0:
-    Missing nullability on parameter `intent` in method `startActivity`
-MissingNullability: androidx.fragment.app.Fragment#startActivity(android.content.Intent, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `intent` in method `startActivity`
-MissingNullability: androidx.fragment.app.FragmentActivity#startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int) parameter #1:
-    Missing nullability on parameter `intent` in method `startActivityFromFragment`
-MissingNullability: androidx.fragment.app.FragmentActivity#startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `intent` in method `startActivityFromFragment`
 MissingNullability: androidx.fragment.app.FragmentController#getActiveFragments(java.util.List<androidx.fragment.app.Fragment>) parameter #0:
     Missing nullability on parameter `actives` in method `getActiveFragments`
-MissingNullability: androidx.fragment.app.FragmentHostCallback#onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int) parameter #1:
-    Missing nullability on parameter `intent` in method `onStartActivityFromFragment`
-MissingNullability: androidx.fragment.app.FragmentHostCallback#onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `intent` in method `onStartActivityFromFragment`
 
 
 NullableCollection: androidx.fragment.app.Fragment#getArguments():
diff --git a/fragment/fragment/lint-baseline.xml b/fragment/fragment/lint-baseline.xml
new file mode 100644
index 0000000..047bc0e
--- /dev/null
+++ b/fragment/fragment/lint-baseline.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/fragment/app/Fragment.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/fragment/app/Fragment.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/fragment/app/FragmentContainerView.kt"/>
+    </issue>
+
+</issues>
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentDismissTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentDismissTest.kt
index 6611e65..f487429 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentDismissTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentDismissTest.kt
@@ -30,6 +30,7 @@
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 import leakcanary.DetectLeaksAfterTestSuccess
+import leakcanary.SkipLeakDetection
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.RuleChain
@@ -110,6 +111,7 @@
     val ruleChain: RuleChain = RuleChain.outerRule(DetectLeaksAfterTestSuccess())
         .around(activityTestRule)
 
+    @SkipLeakDetection("There is a platform ViewRootImpl leak this is triggered on this test")
     @Test
     fun testDialogFragmentDismiss() {
         // Due to b/157955883, we need to early return if API == 30.
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
index b08ff70..8060409 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
@@ -39,9 +39,11 @@
 import androidx.testutils.withUse
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
+import leakcanary.DetectLeaksAfterTestSuccess
 import org.junit.Assert.assertThrows
 import org.junit.Rule
 import org.junit.Test
+import org.junit.rules.RuleChain
 import org.junit.runner.RunWith
 
 @LargeTest
@@ -49,17 +51,12 @@
 class DialogFragmentTest {
 
     @Suppress("DEPRECATION")
-    @get:Rule
     val activityTestRule =
         androidx.test.rule.ActivityTestRule(EmptyFragmentTestActivity::class.java)
 
-    // TODO(b/270722758): Add back in leak detection rule chain once leak addressed by platform
-    // Detect leaks BEFORE and AFTER activity is destroyed
-    /*
     @get:Rule
     val ruleChain: RuleChain = RuleChain.outerRule(DetectLeaksAfterTestSuccess())
         .around(activityTestRule)
-     */
 
     @Test
     fun testDialogFragmentShows() {
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 9ea6d81..3eb995c 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
@@ -31,6 +31,7 @@
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import leakcanary.DetectLeaksAfterTestSuccess
+import leakcanary.SkipLeakDetection
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
@@ -359,6 +360,7 @@
         )
     }
 
+    @SkipLeakDetection("This test throws an exception and can end in an invalid state")
     @Suppress("DEPRECATION")
     @Test
     public fun detectTargetFragmentUsage() {
diff --git a/glance/glance/api/api_lint.ignore b/glance/glance/api/api_lint.ignore
deleted file mode 100644
index 777b6e0..0000000
--- a/glance/glance/api/api_lint.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-KotlinDefaultParameterOrder: androidx.glance.template.GalleryTemplateData#GalleryTemplateData(androidx.glance.template.HeaderBlock, androidx.glance.template.TextBlock, androidx.glance.template.ImageBlock, androidx.glance.template.ActionBlock, androidx.glance.template.ImageBlock) parameter #0:
-    Parameter `header` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
-KotlinDefaultParameterOrder: androidx.glance.template.GalleryTemplateData#GalleryTemplateData(androidx.glance.template.HeaderBlock, androidx.glance.template.TextBlock, androidx.glance.template.ImageBlock, androidx.glance.template.ActionBlock, androidx.glance.template.ImageBlock) parameter #3:
-    Parameter `mainActionBlock` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 7a3d714..b5afe34 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -182,7 +182,7 @@
 kotlinCoroutinesRx3 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx3", version.ref = "kotlinCoroutines" }
 kotlinDaemonEmbeddable = { module = "org.jetbrains.kotlin:kotlin-daemon-embeddable" }
 kotlinKlibCommonizer = { module = "org.jetbrains.kotlin:kotlin-klib-commonizer" }
-kotlinMetadataJvm = { module = "org.jetbrains.kotlinx:kotlinx-metadata-jvm", version = "0.6.2" }
+kotlinMetadataJvm = { module = "org.jetbrains.kotlinx:kotlinx-metadata-jvm", version = "0.7.0" }
 kotlinSerializationCore = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinSerialization" }
 kotlinSerializationProtobuf = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", version.ref = "kotlinSerialization" }
 kotlinGradlePluginz = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
diff --git a/graphics/graphics-core/api/api_lint.ignore b/graphics/graphics-core/api/api_lint.ignore
new file mode 100644
index 0000000..679511d
--- /dev/null
+++ b/graphics/graphics-core/api/api_lint.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+NotCloseable: androidx.graphics.lowlatency.CanvasFrontBufferedRenderer:
+    Classes that release resources (release(), release()) should implement AutoCloseable and CloseGuard: class androidx.graphics.lowlatency.CanvasFrontBufferedRenderer
+NotCloseable: androidx.graphics.lowlatency.GLFrontBufferedRenderer:
+    Classes that release resources (release(), release()) should implement AutoCloseable and CloseGuard: class androidx.graphics.lowlatency.GLFrontBufferedRenderer
+NotCloseable: androidx.graphics.opengl.GLFrameBufferRenderer:
+    Classes that release resources (release(), release()) should implement AutoCloseable and CloseGuard: class androidx.graphics.opengl.GLFrameBufferRenderer
+NotCloseable: androidx.graphics.opengl.GLRenderer:
+    Classes that release resources (stop(), stop()) should implement AutoCloseable and CloseGuard: class androidx.graphics.opengl.GLRenderer
+NotCloseable: androidx.graphics.opengl.egl.EGLManager:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class androidx.graphics.opengl.egl.EGLManager
+NotCloseable: androidx.graphics.surface.SurfaceControlCompat:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class androidx.graphics.surface.SurfaceControlCompat
diff --git a/graphics/graphics-core/api/current.txt b/graphics/graphics-core/api/current.txt
index d76c206..d24a0b7 100644
--- a/graphics/graphics-core/api/current.txt
+++ b/graphics/graphics-core/api/current.txt
@@ -137,6 +137,7 @@
   }
 
   public static interface GLFrameBufferRenderer.Callback {
+    method @WorkerThread public default void onBufferReleased(androidx.graphics.opengl.FrameBuffer frameBuffer, androidx.hardware.SyncFenceCompat? releaseFence);
     method @WorkerThread public default void onDrawComplete(androidx.graphics.surface.SurfaceControlCompat targetSurfaceControl, androidx.graphics.surface.SurfaceControlCompat.Transaction transaction, androidx.graphics.opengl.FrameBuffer frameBuffer, androidx.hardware.SyncFenceCompat? syncFence);
     method @WorkerThread public void onDrawFrame(androidx.graphics.opengl.egl.EGLManager eglManager, int width, int height, androidx.graphics.lowlatency.BufferInfo bufferInfo, float[] transform);
   }
diff --git a/graphics/graphics-core/api/restricted_current.txt b/graphics/graphics-core/api/restricted_current.txt
index 84af224..b0f0ee2 100644
--- a/graphics/graphics-core/api/restricted_current.txt
+++ b/graphics/graphics-core/api/restricted_current.txt
@@ -137,6 +137,7 @@
   }
 
   public static interface GLFrameBufferRenderer.Callback {
+    method @WorkerThread public default void onBufferReleased(androidx.graphics.opengl.FrameBuffer frameBuffer, androidx.hardware.SyncFenceCompat? releaseFence);
     method @WorkerThread public default void onDrawComplete(androidx.graphics.surface.SurfaceControlCompat targetSurfaceControl, androidx.graphics.surface.SurfaceControlCompat.Transaction transaction, androidx.graphics.opengl.FrameBuffer frameBuffer, androidx.hardware.SyncFenceCompat? syncFence);
     method @WorkerThread public void onDrawFrame(androidx.graphics.opengl.egl.EGLManager eglManager, int width, int height, androidx.graphics.lowlatency.BufferInfo bufferInfo, float[] transform);
   }
diff --git a/graphics/graphics-core/build.gradle b/graphics/graphics-core/build.gradle
index aab94bb..f5a4f87 100644
--- a/graphics/graphics-core/build.gradle
+++ b/graphics/graphics-core/build.gradle
@@ -42,7 +42,6 @@
     namespace 'androidx.graphics.core'
 
     defaultConfig {
-        minSdkVersion 17
         externalNativeBuild {
             def versionScript = file("src/main/cpp/jni.lds").getAbsolutePath()
 
diff --git a/graphics/graphics-core/lint-baseline.xml b/graphics/graphics-core/lint-baseline.xml
index 8fbd449..fc2cfd6 100644
--- a/graphics/graphics-core/lint-baseline.xml
+++ b/graphics/graphics-core/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_0 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_90"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -12,7 +12,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_90 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_180"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -21,7 +21,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_180 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_270"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -30,7 +30,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_270 -> SurfaceControlCompat.BUFFER_TRANSFORM_IDENTITY"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -39,7 +39,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_0 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_180"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -48,7 +48,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_90 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_270"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -57,7 +57,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_180 -> SurfaceControlCompat.BUFFER_TRANSFORM_IDENTITY"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -66,7 +66,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_270 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_90"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -75,7 +75,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_0 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_270"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -84,7 +84,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_90 -> SurfaceControlCompat.BUFFER_TRANSFORM_IDENTITY"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -93,7 +93,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_180 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_90"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -102,7 +102,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_270 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_180"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -111,7 +111,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_0 -> SurfaceControlCompat.BUFFER_TRANSFORM_IDENTITY"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -120,7 +120,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_90 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_90"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -129,7 +129,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_180 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_180"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -138,7 +138,7 @@
 
     <issue
         id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
+        message="Field requires API level 29 (current min is 19): `Companion`"
         errorLine1="                    Surface.ROTATION_270 -> SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_270"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -146,111 +146,75 @@
     </issue>
 
     <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="            SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_90 ->"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
+            file="src/main/java/androidx/opengl/EGLExt.kt"/>
     </issue>
 
     <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="                SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_270"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
+            file="src/main/java/androidx/opengl/EGLExt.kt"/>
     </issue>
 
     <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="            SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_180 ->"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
+            file="src/main/java/androidx/graphics/opengl/FrameBufferRenderer.kt"/>
     </issue>
 
     <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="                SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_180"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            @RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
+            file="src/main/java/androidx/graphics/opengl/FrameBufferRenderer.kt"/>
     </issue>
 
     <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="            SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_270 ->"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
+            file="src/main/java/androidx/graphics/lowlatency/FrontBufferSyncStrategy.kt"/>
     </issue>
 
     <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="                SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_90"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
+            file="src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt"/>
     </issue>
 
     <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="            SurfaceControlCompat.BUFFER_TRANSFORM_IDENTITY ->"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
+            file="src/main/java/androidx/hardware/SyncFenceCompat.kt"/>
     </issue>
 
     <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="                SurfaceControlCompat.BUFFER_TRANSFORM_IDENTITY"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.KITKAT)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="            SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_90 -> {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="            SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_180 -> {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="            SurfaceControlCompat.BUFFER_TRANSFORM_ROTATE_270 -> {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 29 (current min is 17): `Companion`"
-        errorLine1="            SurfaceControlCompat.BUFFER_TRANSFORM_IDENTITY -> {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/graphics/lowlatency/BufferTransformer.kt"/>
+            file="src/main/java/androidx/hardware/SyncFenceV19.kt"/>
     </issue>
 
 </issues>
diff --git a/graphics/graphics-core/samples/build.gradle b/graphics/graphics-core/samples/build.gradle
index 0f841c0..cdf56a1 100644
--- a/graphics/graphics-core/samples/build.gradle
+++ b/graphics/graphics-core/samples/build.gradle
@@ -32,9 +32,6 @@
 
 android {
     namespace "androidx.graphics.core.samples"
-    defaultConfig {
-        minSdkVersion 17
-    }
 }
 
 androidx {
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/CanvasFrontBufferedRendererTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/CanvasFrontBufferedRendererTest.kt
index ad46a11..01f7e84 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/CanvasFrontBufferedRendererTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/CanvasFrontBufferedRendererTest.kt
@@ -26,7 +26,6 @@
 import android.view.SurfaceHolder
 import android.view.SurfaceView
 import androidx.annotation.RequiresApi
-import androidx.core.os.BuildCompat
 import androidx.graphics.drawSquares
 import androidx.graphics.opengl.SurfaceViewTestActivity
 import androidx.graphics.surface.SurfaceControlCompat
@@ -40,9 +39,11 @@
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.Executors
 import java.util.concurrent.TimeUnit
+import java.util.concurrent.atomic.AtomicInteger
 import java.util.concurrent.atomic.AtomicReference
 import kotlin.math.roundToInt
 import org.junit.Assert
+import org.junit.Assert.assertEquals
 import org.junit.Assert.assertTrue
 import org.junit.Assert.fail
 import org.junit.Test
@@ -55,11 +56,8 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun testFrontBufferedLayerRender() {
-        if (!isSupported()) {
-            return
-        }
-        val renderLatch = CountDownLatch(1)
-        val callbacks = object : CanvasFrontBufferedRenderer.Callback<Any> {
+        val renderLatch = AtomicReference<CountDownLatch?>()
+        verifyCanvasFrontBufferedRenderer(object : CanvasFrontBufferedRenderer.Callback<Any> {
             override fun onDrawFrontBufferedLayer(
                 canvas: Canvas,
                 bufferWidth: Int,
@@ -87,33 +85,25 @@
                         Executors.newSingleThreadExecutor(),
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                renderLatch.countDown()
+                                renderLatch.get()?.countDown()
                             }
                         }
                     )
                 } else {
-                    renderLatch.countDown()
+                    renderLatch.get()?.countDown()
                 }
             }
-        }
-        var renderer: CanvasFrontBufferedRenderer<Any>? = null
-        var surfaceView: SurfaceView? = null
-        try {
-            val scenario = ActivityScenario.launch(SurfaceViewTestActivity::class.java)
-                .moveToState(Lifecycle.State.CREATED)
-                .onActivity {
-                    surfaceView = it.getSurfaceView()
-                    renderer = CanvasFrontBufferedRenderer(surfaceView!!, callbacks)
-                }
+        }) { scenario, renderer, surfaceView ->
+            renderLatch.set(CountDownLatch(1))
             scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                renderer?.renderFrontBufferedLayer(Any())
+                renderer.renderFrontBufferedLayer(Any())
             }
-            Assert.assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+            Assert.assertTrue(renderLatch.get()!!.await(3000, TimeUnit.MILLISECONDS))
 
             val coords = IntArray(2)
             val width: Int
             val height: Int
-            with(surfaceView!!) {
+            with(surfaceView) {
                 getLocationOnScreen(coords)
                 width = this.width
                 height = this.height
@@ -123,19 +113,14 @@
                 Color.RED ==
                     bitmap.getPixel(coords[0] + width / 2, coords[1] + height / 2)
             }
-        } finally {
-            renderer.blockingRelease()
         }
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun testMultiBufferedLayerRender() {
-        if (!isSupported()) {
-            return
-        }
-        val renderLatch = CountDownLatch(1)
-        val callbacks = object : CanvasFrontBufferedRenderer.Callback<Any> {
+        val renderLatch = AtomicReference<CountDownLatch?>()
+        verifyCanvasFrontBufferedRenderer(object : CanvasFrontBufferedRenderer.Callback<Any> {
 
             override fun onDrawFrontBufferedLayer(
                 canvas: Canvas,
@@ -165,34 +150,25 @@
                         Executors.newSingleThreadExecutor(),
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                renderLatch.countDown()
+                                renderLatch.get()?.countDown()
                             }
                         })
                 } else {
-                    renderLatch.countDown()
+                    renderLatch.get()?.countDown()
                 }
             }
-        }
-        var renderer: CanvasFrontBufferedRenderer<Any>? = null
-        var surfaceView: SurfaceView? = null
-        try {
-            val scenario = ActivityScenario.launch(SurfaceViewTestActivity::class.java)
-                .moveToState(Lifecycle.State.CREATED)
-                .onActivity {
-                    surfaceView = it.getSurfaceView()
-                    renderer = CanvasFrontBufferedRenderer(surfaceView!!, callbacks)
-                }
-
+        }) { scenario, renderer, surfaceView ->
+            renderLatch.set(CountDownLatch(1))
             scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                renderer?.renderFrontBufferedLayer(Any())
-                renderer?.commit()
+                renderer.renderFrontBufferedLayer(Any())
+                renderer.commit()
             }
-            Assert.assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+            Assert.assertTrue(renderLatch.get()!!.await(3000, TimeUnit.MILLISECONDS))
 
             val coords = IntArray(2)
             val width: Int
             val height: Int
-            with(surfaceView!!) {
+            with(surfaceView) {
                 getLocationOnScreen(coords)
                 width = this.width
                 height = this.height
@@ -224,8 +200,6 @@
                         )
                     ) < 2)
             }
-        } finally {
-            renderer?.blockingRelease()
         }
     }
 
@@ -331,11 +305,9 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun testCancelFrontBufferLayerRender() {
-        if (!isSupported()) {
-            return
-        }
         val squareSize = 100f
-        val renderLatch = CountDownLatch(1)
+        val renderLatch = AtomicReference(CountDownLatch(1))
+        val commitLatch = AtomicReference<CountDownLatch?>()
         val callbacks = object : CanvasFrontBufferedRenderer.Callback<Int> {
 
             override fun onDrawFrontBufferedLayer(
@@ -353,6 +325,7 @@
                 bufferHeight: Int,
                 params: Collection<Int>
             ) {
+                commitLatch.get()?.await()
                 for (p in params) {
                     canvas.drawColor(p)
                 }
@@ -368,11 +341,11 @@
                         Executors.newSingleThreadExecutor(),
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                renderLatch.countDown()
+                                renderLatch.get().countDown()
                             }
                         })
                 } else {
-                    renderLatch.countDown()
+                    renderLatch.get().countDown()
                 }
             }
         }
@@ -386,15 +359,24 @@
                     renderer = CanvasFrontBufferedRenderer(surfaceView!!, callbacks)
                 }
 
-            scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                with(renderer!!) {
-                    renderFrontBufferedLayer(Color.BLUE)
-                    commit()
-                    renderFrontBufferedLayer(Color.RED)
-                    cancel()
-                }
+            scenario.moveToState(Lifecycle.State.RESUMED)
+
+            assertTrue(renderLatch.get().await(3000, TimeUnit.MILLISECONDS))
+
+            with(renderer!!) {
+                renderFrontBufferedLayer(Color.BLUE)
+
+                commitLatch.set(CountDownLatch(1))
+                commit()
+
+                renderFrontBufferedLayer(Color.RED)
+                cancel()
+
+                renderLatch.set(CountDownLatch(1))
+                commitLatch.get()!!.countDown()
             }
-            Assert.assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+
+            Assert.assertTrue(renderLatch.get().await(3000, TimeUnit.MILLISECONDS))
 
             val coords = IntArray(2)
             with(surfaceView!!) {
@@ -417,12 +399,8 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun testClear() {
-        if (!isSupported()) {
-            return
-        }
-
-        val renderLatch = CountDownLatch(2)
-        val callbacks = object : CanvasFrontBufferedRenderer.Callback<Int> {
+        val renderLatch = AtomicReference<CountDownLatch?>()
+        verifyCanvasFrontBufferedRenderer(object : CanvasFrontBufferedRenderer.Callback<Int> {
 
             override fun onDrawFrontBufferedLayer(
                 canvas: Canvas,
@@ -454,36 +432,27 @@
                         Executors.newSingleThreadExecutor(),
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                renderLatch.countDown()
+                                renderLatch.get()?.countDown()
                             }
                         })
                 } else {
-                    renderLatch.countDown()
+                    renderLatch.get()?.countDown()
                 }
             }
-        }
-        var renderer: CanvasFrontBufferedRenderer<Int>? = null
-        var surfaceView: SurfaceView? = null
-        try {
-            val scenario = ActivityScenario.launch(SurfaceViewTestActivity::class.java)
-                .moveToState(Lifecycle.State.CREATED)
-                .onActivity {
-                    surfaceView = it.getSurfaceView()
-                    renderer = CanvasFrontBufferedRenderer(surfaceView!!, callbacks)
-                }
-
+        }) { scenario, renderer, surfaceView ->
+            renderLatch.set(CountDownLatch(2))
             scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                with(renderer!!) {
+                with(renderer) {
                     renderFrontBufferedLayer(Color.BLUE)
                     commit()
                     renderFrontBufferedLayer(Color.RED)
                     clear()
                 }
             }
-            Assert.assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+            Assert.assertTrue(renderLatch.get()!!.await(3000, TimeUnit.MILLISECONDS))
 
             val coords = IntArray(2)
-            with(surfaceView!!) {
+            with(surfaceView) {
                 getLocationOnScreen(coords)
             }
 
@@ -494,13 +463,11 @@
                     val topQuadY = coords[1] + height / 4
                     val bottomQuadY = topQuadY + height / 2
                     Color.WHITE == getPixel(leftQuadX, topQuadY) &&
-                    Color.WHITE == getPixel(rightQuadX, topQuadY) &&
-                    Color.WHITE == getPixel(leftQuadX, bottomQuadY) &&
-                    Color.WHITE == getPixel(rightQuadX, bottomQuadY)
+                        Color.WHITE == getPixel(rightQuadX, topQuadY) &&
+                        Color.WHITE == getPixel(leftQuadX, bottomQuadY) &&
+                        Color.WHITE == getPixel(rightQuadX, bottomQuadY)
                 }
             }
-        } finally {
-            renderer?.blockingRelease()
         }
     }
 
@@ -630,11 +597,8 @@
 
     @RequiresApi(Build.VERSION_CODES.Q)
     fun parentLayerRotationTest(rotation: Int) {
-        if (!isSupported()) {
-            return
-        }
         var surfaceView: SurfaceView? = null
-        val renderLatch = CountDownLatch(1)
+        val renderLatch = AtomicReference(CountDownLatch(1))
         val topLeftColor = Color.RED
         val topRightColor = Color.YELLOW
         val bottomRightColor = Color.BLACK
@@ -676,11 +640,11 @@
                         Executors.newSingleThreadExecutor(),
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                renderLatch.countDown()
+                                renderLatch.get().countDown()
                             }
                         })
                 } else {
-                    renderLatch.countDown()
+                    renderLatch.get().countDown()
                 }
             }
         }
@@ -688,23 +652,29 @@
         val automation = InstrumentationRegistry.getInstrumentation().uiAutomation
         var renderer: CanvasFrontBufferedRenderer<Any>? = null
 
+        var scenario: ActivityScenario<SurfaceViewTestActivity>? = null
+        val destroyLatch = CountDownLatch(1)
         try {
             Assert.assertTrue(automation.setRotation(rotation))
             automation.waitForIdle(1000, 3000)
 
-            val scenario = ActivityScenario.launch(SurfaceViewTestActivity::class.java)
+            scenario = ActivityScenario.launch(SurfaceViewTestActivity::class.java)
                 .moveToState(Lifecycle.State.CREATED)
                 .onActivity {
+                    it.setOnDestroyCallback { destroyLatch.countDown() }
                     surfaceView = it.getSurfaceView()
                     renderer = CanvasFrontBufferedRenderer(surfaceView!!, callbacks)
                 }
 
-            scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                renderer?.renderFrontBufferedLayer(Any())
-                renderer?.commit()
-            }
+            renderLatch.set(CountDownLatch(1))
 
-            Assert.assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+            scenario.moveToState(Lifecycle.State.RESUMED)
+            assertTrue(renderLatch.get().await(3000, TimeUnit.MILLISECONDS))
+
+            renderer?.renderFrontBufferedLayer(Any())
+            renderer?.commit()
+
+            Assert.assertTrue(renderLatch.get().await(3000, TimeUnit.MILLISECONDS))
 
             val coords = IntArray(2)
             val width: Int
@@ -738,9 +708,13 @@
                     bottomLeftActual == bottomLeftColor
             }
         } finally {
+            renderer.blockingRelease()
             automation.setRotation(UiAutomation.ROTATION_UNFREEZE)
             automation.waitForIdle(1000, 3000)
-            renderer.blockingRelease()
+            if (scenario != null) {
+                scenario.moveToState(Lifecycle.State.DESTROYED)
+                assertTrue(destroyLatch.await(3000, TimeUnit.MILLISECONDS))
+            }
         }
     }
 
@@ -894,9 +868,6 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
     @Test
     fun testFrontBufferRenderWithDisplayP3() {
-        if (!isSupported()) {
-            return
-        }
 
         val displayP3ColorSpace = ColorSpace.getFromDataSpace(DataSpace.DATASPACE_DISPLAY_P3)!!
         val darkRed = Color.pack(0x6F / 255f, 0f, 0f, 1f, displayP3ColorSpace)
@@ -910,7 +881,8 @@
         )
         assertTrue(Color.isSrgb(converted))
         val argb = Color.toArgb(converted)
-        val renderLatch = CountDownLatch(1)
+        val multiBufferLatch = CountDownLatch(1)
+        val frontBufferLatch = CountDownLatch(1)
         val callbacks = object : CanvasFrontBufferedRenderer.Callback<Any> {
             override fun onDrawFrontBufferedLayer(
                 canvas: Canvas,
@@ -943,12 +915,31 @@
                         Executors.newSingleThreadExecutor(),
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                renderLatch.countDown()
+                                frontBufferLatch.countDown()
                             }
                         }
                     )
                 } else {
-                    renderLatch.countDown()
+                    frontBufferLatch.countDown()
+                }
+            }
+
+            override fun onMultiBufferedLayerRenderComplete(
+                frontBufferedLayerSurfaceControl: SurfaceControlCompat,
+                multiBufferedLayerSurfaceControl: SurfaceControlCompat,
+                transaction: SurfaceControlCompat.Transaction
+            ) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+                    transaction.addTransactionCommittedListener(
+                        Executors.newSingleThreadExecutor(),
+                        object : SurfaceControlCompat.TransactionCommittedListener {
+                            override fun onTransactionCommitted() {
+                                multiBufferLatch.countDown()
+                            }
+                        }
+                    )
+                } else {
+                    multiBufferLatch.countDown()
                 }
             }
         }
@@ -972,10 +963,13 @@
                         configureRenderer.invoke(this)
                     }
                 }
-            scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                renderer?.renderFrontBufferedLayer(Any())
-            }
-            Assert.assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+            scenario.moveToState(Lifecycle.State.RESUMED)
+
+            assertTrue(multiBufferLatch.await(3000, TimeUnit.MILLISECONDS))
+
+            renderer?.renderFrontBufferedLayer(Any())
+
+            assertTrue(frontBufferLatch.await(3000, TimeUnit.MILLISECONDS))
 
             val coords = IntArray(2)
             val width: Int
@@ -996,9 +990,6 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
     @Test
     fun testMultiBufferedLayerRenderWithDisplayP3() {
-        if (!isSupported()) {
-            return
-        }
 
         val displayP3ColorSpace = ColorSpace.getFromDataSpace(DataSpace.DATASPACE_DISPLAY_P3)!!
         val darkRed = Color.pack(0x6F / 255f, 0f, 0f, 1f, displayP3ColorSpace)
@@ -1012,7 +1003,7 @@
         )
         assertTrue(Color.isSrgb(converted))
         val argb = Color.toArgb(converted)
-        val renderLatch = CountDownLatch(1)
+        val renderLatch = AtomicReference(CountDownLatch(1))
         val callbacks = object : CanvasFrontBufferedRenderer.Callback<Any> {
             override fun onDrawFrontBufferedLayer(
                 canvas: Canvas,
@@ -1046,12 +1037,12 @@
                         Executors.newSingleThreadExecutor(),
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                renderLatch.countDown()
+                                renderLatch.get().countDown()
                             }
                         }
                     )
                 } else {
-                    renderLatch.countDown()
+                    renderLatch.get().countDown()
                 }
             }
         }
@@ -1075,11 +1066,15 @@
                         configureRenderer.invoke(this)
                     }
                 }
-            scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                renderer?.renderFrontBufferedLayer(Any())
-                renderer?.commit()
-            }
-            Assert.assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+            scenario.moveToState(Lifecycle.State.RESUMED)
+
+            assertTrue(renderLatch.get().await(3000, TimeUnit.MILLISECONDS))
+
+            renderLatch.set(CountDownLatch(1))
+            renderer?.renderFrontBufferedLayer(Any())
+            renderer?.commit()
+
+            Assert.assertTrue(renderLatch.get().await(3000, TimeUnit.MILLISECONDS))
 
             val coords = IntArray(2)
             val width: Int
@@ -1097,9 +1092,144 @@
         }
     }
 
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
+    @Test
+    fun testFrontBufferRenderWhileCommitPendingExecutes() {
+        val commitLatch = AtomicReference<CountDownLatch?>()
+        val pendingFrontBufferRenderLatch = AtomicReference<CountDownLatch?>()
+        verifyCanvasFrontBufferedRenderer(
+            object : CanvasFrontBufferedRenderer.Callback<Int> {
+                override fun onDrawFrontBufferedLayer(
+                    canvas: Canvas,
+                    bufferWidth: Int,
+                    bufferHeight: Int,
+                    param: Int
+                ) {
+                    canvas.drawColor(param)
+                }
+
+                override fun onDrawMultiBufferedLayer(
+                    canvas: Canvas,
+                    bufferWidth: Int,
+                    bufferHeight: Int,
+                    params: Collection<Int>
+                ) {
+                    for (p in params) {
+                        canvas.drawColor(p)
+                    }
+
+                    commitLatch.get()?.await()
+                }
+
+                override fun onFrontBufferedLayerRenderComplete(
+                    frontBufferedLayerSurfaceControl: SurfaceControlCompat,
+                    transaction: SurfaceControlCompat.Transaction
+                ) {
+                    pendingFrontBufferRenderLatch.get()?.countDown()
+                }
+            }
+        ) { _, renderer, surfaceView ->
+            val latch = CountDownLatch(1)
+            commitLatch.set(latch)
+            renderer.renderFrontBufferedLayer(Color.RED)
+            renderer.commit()
+
+            pendingFrontBufferRenderLatch.set(CountDownLatch(1))
+            renderer.renderFrontBufferedLayer(Color.BLUE)
+
+            latch.countDown()
+
+            assertTrue(
+                pendingFrontBufferRenderLatch.get()!!.await(3000, TimeUnit.MILLISECONDS)
+            )
+
+            val coords = IntArray(2)
+            val width: Int
+            val height: Int
+            with(surfaceView) {
+                getLocationOnScreen(coords)
+                width = this.width
+                height = this.height
+            }
+
+            SurfaceControlUtils.validateOutput { bitmap ->
+                Color.BLUE == bitmap.getPixel(coords[0] + width / 2, coords[1] + height / 2)
+            }
+        }
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
+    @Test
+    fun testCommitWhileCommitPendingExecutes() {
+        val commitLatch = AtomicReference<CountDownLatch?>()
+        val pendingCommitLatch = AtomicReference<CountDownLatch?>()
+        val commitCount = AtomicInteger(0)
+        verifyCanvasFrontBufferedRenderer(
+            object : CanvasFrontBufferedRenderer.Callback<Int> {
+                override fun onDrawFrontBufferedLayer(
+                    canvas: Canvas,
+                    bufferWidth: Int,
+                    bufferHeight: Int,
+                    param: Int
+                ) {
+                    // NO-OP
+                }
+
+                override fun onDrawMultiBufferedLayer(
+                    canvas: Canvas,
+                    bufferWidth: Int,
+                    bufferHeight: Int,
+                    params: Collection<Int>
+                ) {
+                    for (p in params) {
+                        canvas.drawColor(p)
+                    }
+                    commitCount.incrementAndGet()
+
+                    commitLatch.get()?.await()
+                }
+
+                override fun onMultiBufferedLayerRenderComplete(
+                    frontBufferedLayerSurfaceControl: SurfaceControlCompat,
+                    multiBufferedLayerSurfaceControl: SurfaceControlCompat,
+                    transaction: SurfaceControlCompat.Transaction
+                ) {
+                    pendingCommitLatch.get()?.countDown()
+                }
+            }
+        ) { _, renderer, surfaceView ->
+            val latch = CountDownLatch(1)
+            commitLatch.set(latch)
+            renderer.renderFrontBufferedLayer(Color.RED)
+            renderer.commit()
+
+            renderer.renderFrontBufferedLayer(Color.BLUE)
+            renderer.commit()
+
+            latch.countDown()
+            pendingCommitLatch.set(CountDownLatch(1))
+
+            assertTrue(pendingCommitLatch.get()!!.await(3000, TimeUnit.MILLISECONDS))
+
+            val coords = IntArray(2)
+            val width: Int
+            val height: Int
+            with(surfaceView) {
+                getLocationOnScreen(coords)
+                width = this.width
+                height = this.height
+            }
+
+            assertEquals(2, commitCount.get())
+            SurfaceControlUtils.validateOutput { bitmap ->
+                Color.BLUE == bitmap.getPixel(coords[0] + width / 2, coords[1] + height / 2)
+            }
+        }
+    }
+
     @RequiresApi(Build.VERSION_CODES.Q)
     private fun CanvasFrontBufferedRenderer<*>?.blockingRelease(timeoutMillis: Long = 3000) {
-        if (this != null) {
+        if (this != null && this.isValid()) {
             val destroyLatch = CountDownLatch(1)
             release(false) {
                 destroyLatch.countDown()
@@ -1110,18 +1240,95 @@
         }
     }
 
-    private fun isSupported(): Boolean =
-        // See "b/277225133" these tests pass on cuttlefish + other devices but fail for some reason
-        // FTL configured API level 33 emulator instances
-        // Additionally some cuttlefish instances don't support rotation based testing (b/277764242)
-        isSupportedGphone() && isSupportedCuttlefish()
+    @RequiresApi(Build.VERSION_CODES.Q)
+    private fun <T> verifyCanvasFrontBufferedRenderer(
+        callbacks: CanvasFrontBufferedRenderer.Callback<T>,
+        block: CanvasFrontBufferTestCallback<T>
+    ) {
+        val firstRenderLatch = CountDownLatch(1)
+        val wrappedCallbacks = object : CanvasFrontBufferedRenderer.Callback<T> {
+            override fun onDrawFrontBufferedLayer(
+                canvas: Canvas,
+                bufferWidth: Int,
+                bufferHeight: Int,
+                param: T
+            ) {
+                callbacks.onDrawFrontBufferedLayer(canvas, bufferWidth, bufferHeight, param)
+            }
 
-    private fun isSupportedGphone() =
-        !(Build.MODEL.contains("gphone") &&
-            (Build.VERSION.SDK_INT == 33 || Build.VERSION.SDK_INT == 30))
+            override fun onDrawMultiBufferedLayer(
+                canvas: Canvas,
+                bufferWidth: Int,
+                bufferHeight: Int,
+                params: Collection<T>
+            ) {
+                callbacks.onDrawMultiBufferedLayer(canvas, bufferWidth, bufferHeight, params)
+            }
 
-    @OptIn(BuildCompat.PrereleaseSdkCheck::class)
-    private fun isSupportedCuttlefish() =
-        !(Build.MODEL.contains("Cuttlefish") &&
-            (Build.VERSION.SDK_INT == 30 || BuildCompat.isAtLeastV()))
+            override fun onFrontBufferedLayerRenderComplete(
+                frontBufferedLayerSurfaceControl: SurfaceControlCompat,
+                transaction: SurfaceControlCompat.Transaction
+            ) {
+                callbacks.onFrontBufferedLayerRenderComplete(
+                    frontBufferedLayerSurfaceControl,
+                    transaction
+                )
+            }
+
+            override fun onMultiBufferedLayerRenderComplete(
+                frontBufferedLayerSurfaceControl: SurfaceControlCompat,
+                multiBufferedLayerSurfaceControl: SurfaceControlCompat,
+                transaction: SurfaceControlCompat.Transaction
+            ) {
+
+                callbacks.onMultiBufferedLayerRenderComplete(
+                    frontBufferedLayerSurfaceControl,
+                    multiBufferedLayerSurfaceControl,
+                    transaction
+                )
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+                    transaction.addTransactionCommittedListener(
+                        executor,
+                        object : SurfaceControlCompat.TransactionCommittedListener {
+                            override fun onTransactionCommitted() {
+                                firstRenderLatch.countDown()
+                            }
+                        }
+                    )
+                } else {
+                    firstRenderLatch.countDown()
+                }
+            }
+        }
+        var renderer: CanvasFrontBufferedRenderer<T>? = null
+        var surfaceView: SurfaceView? = null
+        val destroyLatch = CountDownLatch(1)
+        var scenario: ActivityScenario<SurfaceViewTestActivity>? = null
+        try {
+            scenario = ActivityScenario.launch(SurfaceViewTestActivity::class.java)
+                .moveToState(Lifecycle.State.CREATED)
+                .onActivity {
+                    surfaceView = it.getSurfaceView()
+                    renderer = CanvasFrontBufferedRenderer<T>(surfaceView!!, wrappedCallbacks)
+                    it.setOnDestroyCallback { destroyLatch.countDown() }
+                }
+            scenario.moveToState(Lifecycle.State.RESUMED)
+            assertTrue(firstRenderLatch.await(3000, TimeUnit.MILLISECONDS))
+            block(scenario, renderer!!, surfaceView!!)
+        } finally {
+            renderer.blockingRelease()
+            if (scenario != null) {
+                scenario.moveToState(Lifecycle.State.DESTROYED)
+                assertTrue(destroyLatch.await(3000, TimeUnit.MILLISECONDS))
+            }
+        }
+    }
+
+    private val executor = Executors.newSingleThreadExecutor()
 }
+
+typealias CanvasFrontBufferTestCallback<T> = (
+    scenario: ActivityScenario<SurfaceViewTestActivity>,
+    renderer: CanvasFrontBufferedRenderer<T>,
+    surfaceView: SurfaceView
+) -> Unit
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
index 3aa4cc6..3febd09 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
@@ -1529,9 +1529,9 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
     fun testFrontBufferClearAfterRender() {
-        var frontLatch = CountDownLatch(1)
-        val commitLatch = CountDownLatch(1)
-        val callbacks = object : GLFrontBufferedRenderer.Callback<Any> {
+        val frontLatch = AtomicReference<CountDownLatch?>()
+        val commitLatch = AtomicReference<CountDownLatch?>()
+        verifyGLFrontBufferedRenderer(object : GLFrontBufferedRenderer.Callback<Any> {
 
             private val mOrthoMatrix = FloatArray(16)
             private val mProjectionMatrix = FloatArray(16)
@@ -1598,11 +1598,11 @@
                         executor,
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                commitLatch.countDown()
+                                commitLatch.get()?.countDown()
                             }
                         })
                 } else {
-                    commitLatch.countDown()
+                    commitLatch.get()?.countDown()
                 }
             }
 
@@ -1615,40 +1615,38 @@
                         executor,
                         object : SurfaceControlCompat.TransactionCommittedListener {
                             override fun onTransactionCommitted() {
-                                frontLatch.countDown()
+                                frontLatch.get()?.countDown()
                             }
                         })
                 } else {
-                    frontLatch.countDown()
+                    frontLatch.get()?.countDown()
                 }
             }
-        }
-        var renderer: GLFrontBufferedRenderer<Any>? = null
-        var surfaceView: SurfaceView? = null
-        try {
-            val scenario = ActivityScenario.launch(SurfaceViewTestActivity::class.java)
-                .moveToState(Lifecycle.State.CREATED)
-                .onActivity {
-                    surfaceView = it.getSurfaceView()
-                    renderer = GLFrontBufferedRenderer(surfaceView!!, callbacks)
-                }
+        }) { _, renderer, surfaceView ->
 
-            scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                renderer?.renderFrontBufferedLayer(Any())
-                assertTrue(frontLatch.await(3000, TimeUnit.MILLISECONDS))
-                renderer?.commit()
+            frontLatch.set(CountDownLatch(1))
 
-                assertTrue(commitLatch.await(3000, TimeUnit.MILLISECONDS))
-                // Contents should be cleared and the front buffer should be visible but transparent
-                frontLatch = CountDownLatch(1)
-                renderer?.renderFrontBufferedLayer(Any())
-            }
-            assertTrue(frontLatch.await(3000, TimeUnit.MILLISECONDS))
+            renderer.renderFrontBufferedLayer(1)
+
+            assertTrue(frontLatch.get()!!.await(3000, TimeUnit.MILLISECONDS))
+
+            commitLatch.set(CountDownLatch(1))
+
+            renderer.commit()
+
+            assertTrue(commitLatch.get()!!.await(3000, TimeUnit.MILLISECONDS))
+
+            // Contents should be cleared and the front buffer should be visible but transparent
+            frontLatch.set(CountDownLatch(1))
+
+            renderer.renderFrontBufferedLayer(2)
+
+            assertTrue(frontLatch.get()!!.await(3000, TimeUnit.MILLISECONDS))
 
             val coords = IntArray(2)
             val width: Int
             val height: Int
-            with(surfaceView!!) {
+            with(surfaceView) {
                 getLocationOnScreen(coords)
                 width = this.width
                 height = this.height
@@ -1680,8 +1678,6 @@
                         )
                     ) < 2)
             }
-        } finally {
-            renderer.blockingRelease()
         }
     }
 
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkCanvasView.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkCanvasView.kt
index b387b5b..577baa8 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkCanvasView.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkCanvasView.kt
@@ -43,7 +43,7 @@
             with(mLinesDrawable) {
                 setBounds(0, 0, bufferWidth, bufferHeight)
                 setLines(param)
-                setColor(Color.MAGENTA)
+                setColor(Color.CYAN)
                 alpha = 128
                 draw(canvas)
             }
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkSurfaceView.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkSurfaceView.kt
index 7dd500f..1c71b0a 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkSurfaceView.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/InkSurfaceView.kt
@@ -45,6 +45,20 @@
     private var mCurrentX: Float = 0f
     private var mCurrentY: Float = 0f
 
+    private val translucentCyan = Color.valueOf(
+        Color.red(Color.CYAN) / 255f,
+        Color.green(Color.CYAN) / 255f,
+        Color.blue(Color.CYAN) / 255f,
+        0.5f
+    ).toArgb()
+
+    private val translucentMagenta = Color.valueOf(
+        Color.red(Color.MAGENTA) / 255f,
+        Color.green(Color.MAGENTA) / 255f,
+        Color.blue(Color.MAGENTA) / 255f,
+        0.5f
+    ).toArgb()
+
     @WorkerThread // GLThread
     private fun obtainRenderer(): LineRenderer =
         mLineRenderer ?: (LineRenderer()
@@ -88,7 +102,7 @@
                 drawLines(mProjection, floatArrayOf(0f, vHeight, vWidth, vHeight), Color.CYAN)
                 drawLines(mProjection, floatArrayOf(vWidth, vHeight, vWidth, 0f), Color.BLUE)
                 drawLines(mProjection, floatArrayOf(vWidth, 0f, 0f, 0f), Color.MAGENTA)
-                drawLines(mProjection, param, Color.YELLOW, LINE_WIDTH)
+                drawLines(mProjection, param, translucentCyan, LINE_WIDTH)
             }
         }
 
@@ -116,7 +130,7 @@
             Matrix.multiplyMM(mProjection, 0, mMVPMatrix, 0, transform, 0)
             mSceneParams.addAll(params)
             for (line in mSceneParams) {
-                obtainRenderer().drawLines(mProjection, line, Color.BLUE, LINE_WIDTH)
+                obtainRenderer().drawLines(mProjection, line, translucentCyan, LINE_WIDTH)
             }
         }
     }
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/LineRenderer.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/LineRenderer.kt
index c583baa..f15c59b 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/LineRenderer.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/LineRenderer.kt
@@ -43,6 +43,8 @@
 
     fun initialize() {
         release()
+        GLES20.glEnable(GLES20.GL_BLEND)
+        GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA)
         mVertexShader = loadShader(GLES20.GL_VERTEX_SHADER, VertexShaderCode)
         mFragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, FragmentShaderCode)
 
@@ -97,10 +99,10 @@
         GLES20.glUseProgram(mGlProgram)
         GLES20.glLineWidth(lineWidth)
         GLES20.glEnableVertexAttribArray(mPositionHandle)
-        mColorArray[0] = Color.red(color).toFloat()
-        mColorArray[1] = Color.green(color).toFloat()
-        mColorArray[2] = Color.blue(color).toFloat()
-        mColorArray[3] = Color.alpha(color).toFloat()
+        mColorArray[0] = Color.red(color) / 255f
+        mColorArray[1] = Color.green(color) / 255f
+        mColorArray[2] = Color.blue(color) / 255f
+        mColorArray[3] = Color.alpha(color) / 255f
         // Set color for drawing the triangle
         GLES20.glUniform4fv(mColorHandle, 1, mColorArray, 0)
         GLES20.glUniformMatrix4fv(mMvpMatrixHandle, 1, false, mvpMatrix, 0)
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/GLFrameBufferRendererTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/GLFrameBufferRendererTest.kt
index 080592e..175cae5 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/GLFrameBufferRendererTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/GLFrameBufferRendererTest.kt
@@ -507,6 +507,60 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     @Test
+    fun testBufferReleaseCallbackInvoked() {
+        val renderLatch = CountDownLatch(1)
+        val bufferReleasedLatch = CountDownLatch(1)
+        val callbacks = object : GLFrameBufferRenderer.Callback {
+
+            override fun onDrawFrame(
+                eglManager: EGLManager,
+                width: Int,
+                height: Int,
+                bufferInfo: BufferInfo,
+                transform: FloatArray
+            ) {
+                renderLatch.countDown()
+            }
+
+            override fun onBufferReleased(
+                frameBuffer: FrameBuffer,
+                releaseFence: SyncFenceCompat?
+            ) {
+                bufferReleasedLatch.countDown()
+            }
+        }
+        var activity: SurfaceViewTestActivity? = null
+        var renderer: GLFrameBufferRenderer? = null
+        var surfaceView: SurfaceView?
+        try {
+            val scenario = ActivityScenario.launch(SurfaceViewTestActivity::class.java)
+                .moveToState(Lifecycle.State.CREATED)
+                .onActivity {
+                    activity = it
+                    surfaceView = it.getSurfaceView()
+                    renderer = GLFrameBufferRenderer.Builder(surfaceView!!, callbacks).build()
+                }
+
+            scenario.moveToState(Lifecycle.State.RESUMED)
+            assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+
+            renderer?.render()
+
+            assertTrue(bufferReleasedLatch.await(3000, TimeUnit.MILLISECONDS))
+
+            val destroyLatch = CountDownLatch(1)
+            activity?.setOnDestroyCallback {
+                destroyLatch.countDown()
+            }
+            scenario.moveToState(Lifecycle.State.DESTROYED)
+            assertTrue(destroyLatch.await(3000, TimeUnit.MILLISECONDS))
+        } finally {
+            renderer.blockingRelease()
+        }
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
+    @Test
     fun testReleaseRemovedSurfaceCallbacks() {
         val callback = object : GLFrameBufferRenderer.Callback {
             override fun onDrawFrame(
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/CanvasFrontBufferedRenderer.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/CanvasFrontBufferedRenderer.kt
index b50a114..3999df0 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/CanvasFrontBufferedRenderer.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/CanvasFrontBufferedRenderer.kt
@@ -36,6 +36,9 @@
 import androidx.hardware.SyncFenceCompat
 import java.util.Collections
 import java.util.concurrent.CountDownLatch
+import java.util.concurrent.atomic.AtomicBoolean
+import java.util.concurrent.atomic.AtomicInteger
+import kotlin.math.max
 
 /**
  * Class responsible for supporting a "front buffered" rendering system. This allows for lower
@@ -95,7 +98,7 @@
      * provided in [renderFrontBufferedLayer]. When [commit] is invoked the collection is used
      * to render the multi-buffered scene and is subsequently cleared
      */
-    private var mParams = ArrayList<T>()
+    private var mParams = ParamQueue<T>()
 
     /**
      * Flag to determine if the [CanvasFrontBufferedRenderer] has previously been released. If this
@@ -106,9 +109,9 @@
 
     /**
      * Flag to determine if a request to clear the front buffer content is pending. This should
-     * only be accessed on the GLThread
+     * only be accessed on the background thread
      */
-    private var mPendingClear = true
+    private val mPendingClear = AtomicBoolean(true)
 
     /**
      * Runnable executed on the GLThread to update [FrontBufferSyncStrategy.isVisible] as well
@@ -123,6 +126,9 @@
         }
     }
 
+    @Volatile
+    private var mFrontBufferReleaseFence: SyncFenceCompat? = null
+    private val mCommitCount = AtomicInteger(0)
     private var mColorSpace: ColorSpace = BufferedRendererImpl.DefaultColorSpace
     private var mInverse = BufferTransformHintResolver.UNKNOWN_TRANSFORM
     private var mWidth = -1
@@ -209,9 +215,13 @@
                 object : SingleBufferedCanvasRenderer.RenderCallbacks<T> {
 
                     override fun render(canvas: Canvas, width: Int, height: Int, param: T) {
-                        if (mPendingClear) {
+                        if (mPendingClear.compareAndSet(true, false)) {
+                            mFrontBufferReleaseFence?.let { fence ->
+                                fence.awaitForever()
+                                fence.close()
+                                mFrontBufferReleaseFence = null
+                            }
                             canvas.drawColor(Color.BLACK, BlendMode.CLEAR)
-                            mPendingClear = false
                         }
                         callback.onDrawFrontBufferedLayer(canvas, width, height, param)
                     }
@@ -221,14 +231,20 @@
                         hardwareBuffer: HardwareBuffer,
                         syncFenceCompat: SyncFenceCompat?
                     ) {
-                        singleBufferedCanvasRenderer?.isVisible = true
                         val transaction = SurfaceControlCompat.Transaction()
                             .setLayer(frontBufferSurfaceControl, Integer.MAX_VALUE)
                             .setBuffer(
                                 frontBufferSurfaceControl,
                                 hardwareBuffer,
-                                syncFenceCompat
-                            )
+                                if (singleBufferedCanvasRenderer?.isVisible == true) {
+                                    null
+                                } else {
+                                    syncFenceCompat
+                                }
+                            ) { releaseFence ->
+                                mFrontBufferReleaseFence?.close()
+                                mFrontBufferReleaseFence = releaseFence
+                            }
                             .setVisibility(frontBufferSurfaceControl, true)
                             .reparent(frontBufferSurfaceControl, parentSurfaceControl)
                         if (inverse != BufferTransformHintResolver.UNKNOWN_TRANSFORM) {
@@ -241,6 +257,7 @@
                             frontBufferSurfaceControl, transaction)
                         transaction.commit()
                         syncFenceCompat?.close()
+                        singleBufferedCanvasRenderer?.isVisible = true
                     }
                 }).apply {
                     colorSpace = mColorSpace
@@ -295,7 +312,9 @@
     fun renderFrontBufferedLayer(param: T) {
         if (isValid()) {
             mParams.add(param)
-            mPersistedCanvasRenderer?.render(param)
+            if (!isCommitting()) {
+                flushPendingFrontBufferRenders()
+            }
         } else {
             Log.w(TAG, "Attempt to render to front buffered layer when " +
                     "CanvasFrontBufferedRenderer has been released"
@@ -303,6 +322,12 @@
         }
     }
 
+    private fun isCommitting() = mCommitCount.get() != 0
+
+    private fun flushPendingFrontBufferRenders() {
+        mParams.flush { p -> mPersistedCanvasRenderer?.render(p) }
+    }
+
     /**
      * Requests to render to the multi buffered layer. This schedules a call to
      * [Callback.onDrawMultiBufferedLayer] with the parameters provided. If the front buffered
@@ -372,6 +397,13 @@
                 .setBuffer(frontBufferSurfaceControl, null)
                 .setVisibility(parentSurfaceControl, true)
                 .setBuffer(parentSurfaceControl, buffer, fence) { releaseFence ->
+                    mPendingClear.set(true)
+                    val result = mCommitCount.updateAndGet { value -> max(value - 1, 0) }
+                    if (result != 0) {
+                        surfaceView.post { commitInternal() }
+                    } else {
+                        flushPendingFrontBufferRenders()
+                    }
                     multiBufferedCanvasRenderer.releaseBuffer(buffer, releaseFence)
                 }
 
@@ -437,7 +469,9 @@
      * this call is ignored.
      */
     fun commit() {
-        commitInternal()
+        if (mCommitCount.getAndIncrement() == 0) {
+            commitInternal()
+        }
     }
 
     /**
@@ -449,8 +483,7 @@
             val persistedCanvasRenderer = mPersistedCanvasRenderer?.apply {
                 cancelPending()
             }
-            val params = mParams
-            mParams = ArrayList<T>()
+            val params = mParams.release()
             val width = mWidth
             val height = mHeight
             val frontBufferSurfaceControl = mFrontBufferSurfaceControl
@@ -458,7 +491,6 @@
             val multiBufferedCanvasRenderer = mMultiBufferedCanvasRenderer
             val inverse = mInverse
             mHandlerThread.execute {
-                mPendingClear = true
                 multiBufferedCanvasRenderer?.let { multiBufferedRenderer ->
                     with(multiBufferedRenderer) {
                         record { canvas ->
@@ -500,6 +532,7 @@
      */
     fun cancel() {
         if (isValid()) {
+            mParams.clear()
             mPersistedCanvasRenderer?.cancelPending()
             mHandlerThread.execute(mCancelRunnable)
             mPersistedCanvasRenderer?.clear()
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/GLFrontBufferedRenderer.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/GLFrontBufferedRenderer.kt
index dccc454..f94ac60 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/GLFrontBufferedRenderer.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/GLFrontBufferedRenderer.kt
@@ -37,10 +37,12 @@
 import androidx.hardware.SyncFenceCompat
 import androidx.opengl.EGLExt.Companion.EGL_ANDROID_NATIVE_FENCE_SYNC
 import androidx.opengl.EGLExt.Companion.EGL_KHR_FENCE_SYNC
-import java.lang.IllegalStateException
 import java.util.Collections
 import java.util.concurrent.ConcurrentLinkedQueue
 import java.util.concurrent.CountDownLatch
+import java.util.concurrent.atomic.AtomicBoolean
+import java.util.concurrent.atomic.AtomicInteger
+import kotlin.math.max
 
 /**
  * Class responsible for supporting a "front buffered" rendering system. This allows for lower
@@ -94,12 +96,11 @@
             bufferInfo: BufferInfo,
             transform: FloatArray
         ) {
-            if (mPendingClear) {
-                GLES20.glViewport(0, 0, bufferInfo.width, bufferInfo.height)
-                GLES20.glClearColor(0f, 0f, 0f, 0f)
-                GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
-                mPendingClear = false
+            if (mPendingClear.compareAndSet(true, false)) {
+                waitForFrontBufferFence()
+                clearContents(width, height)
             }
+            val result = mPendingRenderCount.updateAndGet { value -> max(value - 1, 0) }
             mActiveSegment.next { param ->
                 callback.onDrawFrontBufferedLayer(
                     eglManager,
@@ -110,6 +111,9 @@
                     param
                 )
             }
+            if (result > 0) {
+                mFrontBufferedRenderer?.render()
+            }
         }
 
         override fun onDrawComplete(
@@ -125,28 +129,43 @@
                     releaseFence ->
                 mFrontBufferReleaseFence?.close()
                 mFrontBufferReleaseFence = releaseFence
-                mGLRenderer.execute(mClearFrontBufferRunnable)
             }
             callback.onFrontBufferedLayerRenderComplete(targetSurfaceControl, transaction)
         }
     }
 
+    /**
+     * AtomicInteger to determine if there is a pending request to commit content to the multi
+     * buffered layer
+     */
+    private val mCommitCount = AtomicInteger(0)
+
     @Volatile
     private var mFrontBufferReleaseFence: SyncFenceCompat? = null
 
+    private fun waitForFrontBufferFence() {
+        mFrontBufferReleaseFence?.let { fence ->
+            fence.awaitForever()
+            mFrontBufferReleaseFence = null
+        }
+    }
+
+    private fun clearContents(viewportWidth: Int, viewportHeight: Int) {
+        GLES20.glViewport(0, 0, viewportWidth, viewportHeight)
+        GLES20.glClearColor(0f, 0f, 0f, 0f)
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+        GLES20.glFlush()
+    }
+
     // GLThread
     private val mClearFrontBufferRunnable = Runnable {
         mFrontLayerBuffer?.let { frameBuffer ->
-            if (mPendingClear) {
-                mFrontBufferReleaseFence?.apply {
-                    awaitForever()
-                    close()
-                    mFrontBufferReleaseFence = null
+            if (mPendingClear.compareAndSet(true, false)) {
+                if (!frameBuffer.isClosed) {
+                    frameBuffer.makeCurrent()
+                    waitForFrontBufferFence()
+                    with(frameBuffer) { clearContents(hardwareBuffer.width, hardwareBuffer.height) }
                 }
-                frameBuffer.makeCurrent()
-                GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f)
-                GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
-                mPendingClear = false
             }
         }
     }
@@ -204,6 +223,7 @@
             transaction.apply {
                 mFrontBufferedLayerSurfaceControl?.let { frontSurfaceControl ->
                     setVisibility(frontSurfaceControl, false)
+                    setBuffer(frontSurfaceControl, null)
                     callback.onMultiBufferedLayerRenderComplete(
                         frontSurfaceControl,
                         targetSurfaceControl,
@@ -212,6 +232,21 @@
                 }
             }
         }
+
+        override fun onBufferReleased(frameBuffer: FrameBuffer, releaseFence: SyncFenceCompat?) {
+            if (isValid()) {
+                mPendingClear.set(true)
+                val result = mCommitCount.updateAndGet { value -> max(value - 1, 0) }
+                if (result != 0) {
+                    mGLRenderer.execute { commitInternal() }
+                } else if (mPendingRenderCount.get() > 0) {
+                    mFrontBufferedRenderer?.render()
+                }
+                if (!mFrontBufferSyncStrategy.isVisible) {
+                    mGLRenderer.execute(mClearFrontBufferRunnable)
+                }
+            }
+        }
     }
 
     private val mSurfaceCallbacks = object : SurfaceHolder.Callback2 {
@@ -266,7 +301,13 @@
      * Flag to determine if a request to clear the front buffer content is pending. This should
      * only be accessed on the GLThread
      */
-    private var mPendingClear = false
+    private val mPendingClear = AtomicBoolean(false)
+
+    /**
+     * Count of pending requests to render to the front buffer while content is being committed to
+     * the multi buffered layer
+     */
+    private val mPendingRenderCount = AtomicInteger(0)
 
     /**
      * SurfaceView that hosts both the multi buffered and front buffered SurfaceControls
@@ -274,18 +315,11 @@
     private var mSurfaceView: SurfaceView? = surfaceView
 
     /**
-     * Runnable executed on the GLThread to flip the [mPendingClear] flag
-     */
-    private val mSetPendingClearRunnable = Runnable {
-        mPendingClear = true
-    }
-
-    /**
      * Runnable executed on the GLThread to update [FrontBufferSyncStrategy.isVisible] as well
      * as hide the SurfaceControl associated with the front buffered layer
      */
     private val mCancelRunnable = Runnable {
-        mPendingClear = true
+        mPendingClear.set(true)
         mFrontBufferSyncStrategy.isVisible = false
         mFrontBufferedLayerSurfaceControl?.let { frontBufferSurfaceControl ->
             SurfaceControlCompat.Transaction()
@@ -489,7 +523,11 @@
     fun renderFrontBufferedLayer(param: T) {
         if (isValid()) {
             mActiveSegment.add(param)
-            mFrontBufferedRenderer?.render()
+            if (mCommitCount.get() == 0) {
+                mFrontBufferedRenderer?.render()
+            } else {
+                mPendingRenderCount.incrementAndGet()
+            }
         } else {
             Log.w(
                 TAG, "Attempt to render to front buffered layer when " +
@@ -539,7 +577,7 @@
      */
     fun clear() {
         clearParamQueues()
-        mGLRenderer.execute(mSetPendingClearRunnable)
+        mPendingClear.set(true)
         mMultiBufferedRenderer?.render()
     }
 
@@ -553,9 +591,15 @@
      * this call is ignored.
      */
     fun commit() {
+        if (mCommitCount.getAndIncrement() == 0) {
+            commitInternal()
+        }
+    }
+
+    private fun commitInternal() {
         if (isValid()) {
+            mPendingRenderCount.set(0)
             mSegments.add(mActiveSegment.release())
-            mGLRenderer.execute(mSetPendingClearRunnable)
             mMultiBufferedRenderer?.render()
         } else {
             Log.w(
@@ -575,6 +619,7 @@
     fun cancel() {
         if (isValid()) {
             mActiveSegment.clear()
+            mPendingRenderCount.set(0)
             mGLRenderer.execute(mCancelRunnable)
         } else {
             Log.w(TAG, "Attempt to cancel rendering to front buffer after " +
@@ -743,7 +788,7 @@
         )
 
         /**
-         * Callback invoked to render content into the multid buffered layer with the specified
+         * Callback invoked to render content into the multi buffered layer with the specified
          * parameters.
          * @param eglManager [EGLManager] useful in configuring EGL objects to be used when issuing
          * OpenGL commands to render into the multi buffered layer
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/ParamQueue.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/ParamQueue.kt
index 85538b9..222fb4c 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/ParamQueue.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/ParamQueue.kt
@@ -73,6 +73,22 @@
     }
 
     /**
+     * Similar to [next], but iterates through each item from the current index to the end of
+     * the collection and invokes the given lambda on each parameter.
+     * This does not actually remove the parameter from the collection. Consumers must either
+     * call [clear], or clear the collection returned in [release] to ensure contents do not
+     * grow unbounded.
+     */
+    inline fun flush(block: (T) -> Unit) {
+        mLock.withLock {
+            while (mIndex < mParams.size) {
+                val param = mParams[mIndex++]
+                block(param)
+            }
+        }
+    }
+
+    /**
      * Adds a new entry into the parameter queue. This leaves the current index position unchanged.
      */
     fun add(param: T) {
@@ -81,6 +97,12 @@
         }
     }
 
+    fun addAll(params: Collection<T>) {
+        mLock.withLock {
+            mParams.addAll(params)
+        }
+    }
+
     fun count(): Int = mLock.withLock { mParams.size }
 
     fun isEmpty() = count() == 0
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/opengl/GLFrameBufferRenderer.kt b/graphics/graphics-core/src/main/java/androidx/graphics/opengl/GLFrameBufferRenderer.kt
index 4b08f54..c286271 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/opengl/GLFrameBufferRenderer.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/opengl/GLFrameBufferRenderer.kt
@@ -412,6 +412,11 @@
                         .setVisibility(surfaceControl, true)
                         .setBuffer(surfaceControl, frameBuffer.hardwareBuffer, syncFenceCompat) {
                                 releaseFence ->
+                            if (mGLRenderer.isRunning()) {
+                                mGLRenderer.execute {
+                                    callback.onBufferReleased(frameBuffer, releaseFence)
+                                }
+                            }
                             if (mMaxBuffers > 1 || frameBufferPool.isClosed) {
                                 // Release the previous buffer only if we are not in single buffered
                                 // mode
@@ -616,6 +621,21 @@
         ) {
             // NO-OP
         }
+
+        /**
+         * Optional callback invoked the thread backed by the [GLRenderer] when the provided
+         * framebuffer is released. That is the given [FrameBuffer] instance is no longer being
+         * presented and is not visible.
+         * @param frameBuffer The buffer that is no longer being presented and has returned to the
+         * buffer allocation pool
+         * @param releaseFence Optional fence that must be waited upon before the [FrameBuffer] can
+         * be reused. The framework will invoke this callback early to improve performance and
+         * signal the fence when it is ready to be re-used.
+         */
+        @WorkerThread
+        fun onBufferReleased(frameBuffer: FrameBuffer, releaseFence: SyncFenceCompat?) {
+            // NO-OP
+        }
     }
 
     /**
diff --git a/graphics/graphics-shapes/build.gradle b/graphics/graphics-shapes/build.gradle
index a29bdf5..afabb01 100644
--- a/graphics/graphics-shapes/build.gradle
+++ b/graphics/graphics-shapes/build.gradle
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+import androidx.build.KmpPlatformsKt
 import androidx.build.LibraryType
 import androidx.build.PlatformIdentifier
 
@@ -22,22 +23,25 @@
     id("com.android.library")
 }
 
+def desktopEnabled = KmpPlatformsKt.enableDesktop(project)
+
 androidXMultiplatform {
     android()
+    if (desktopEnabled) desktop()
 
     defaultPlatform(PlatformIdentifier.ANDROID)
 
     sourceSets {
-        all {
+        configureEach {
             languageSettings.optIn("kotlin.RequiresOptIn")
             languageSettings.optIn("kotlin.contracts.ExperimentalContracts")
         }
 
         commonMain {
             dependencies {
-                api(libs.kotlinStdlib)
+                implementation(libs.kotlinStdlibCommon)
                 implementation project(':collection:collection')
-                implementation 'androidx.annotation:annotation:1.7.0-alpha02'
+                implementation("androidx.annotation:annotation:1.1.0")
             }
         }
 
@@ -46,27 +50,83 @@
             }
         }
 
-        androidMain {
+        jvmMain {
             dependsOn(commonMain)
             dependencies {
+            }
+        }
+
+        if (desktopEnabled) {
+            skikoMain {
+                dependsOn(commonMain)
+                dependencies {
+                }
+            }
+        }
+
+        androidMain {
+            dependsOn(jvmMain)
+            dependencies {
                 implementation("androidx.core:core-ktx:1.10.0-rc01")
                 implementation("androidx.core:core-ktx:1.8.0")
             }
         }
 
-        androidInstrumentedTest {
+        if (desktopEnabled) {
+            desktopMain {
+                dependsOn(skikoMain)
+                dependsOn(jvmMain)
+                dependencies {
+                    implementation(libs.kotlinStdlib)
+                }
+            }
+        }
+
+        jvmTest {
             dependsOn(commonTest)
             dependencies {
-                implementation(libs.testExtJunit)
-                implementation(libs.testCore)
-                implementation(libs.testRunner)
+            }
+        }
+
+        androidUnitTest {
+            dependsOn(jvmTest)
+            dependencies {
                 implementation(libs.testRules)
+                implementation(libs.testRunner)
+                implementation(libs.junit)
+                implementation(libs.truth)
+            }
+        }
+
+        androidInstrumentedTest {
+            dependsOn(jvmTest)
+            dependencies {
+                implementation(libs.testRules)
+                implementation(libs.testRunner)
+                implementation(libs.junit)
+                implementation(libs.truth)
+                implementation(libs.dexmakerMockitoInlineExtended)
+                implementation(libs.mockitoKotlin)
+            }
+        }
+
+        if (desktopEnabled) {
+            desktopTest {
+                dependsOn(jvmTest)
+                dependencies {
+                    implementation(libs.truth)
+                    implementation(libs.junit)
+                    implementation(libs.skikoCurrentOs)
+                }
             }
         }
     }
 }
 
 android {
+    defaultConfig {
+        multiDexEnabled = true
+    }
     namespace "androidx.graphics.shapes"
 }
 
@@ -77,4 +137,4 @@
     inceptionYear = "2022"
     description = "create and render rounded polygonal shapes"
     metalavaK2UastEnabled = true
-}
+}
\ No newline at end of file
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Cubic.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Cubic.kt
index d81393f..2725a8f 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Cubic.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Cubic.kt
@@ -26,7 +26,9 @@
  * the slope of the curve between the anchor points.
  */
 open class Cubic internal constructor(internal val points: FloatArray = FloatArray(8)) {
-    init { require(points.size == 8) }
+    init {
+        require(points.size == 8) { "Points array size should be 8" }
+    }
 
     /**
      * The first anchor point x coordinate
@@ -150,9 +152,10 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (javaClass != other?.javaClass) return false
 
-        other as Cubic
+        if (other !is Cubic) {
+            return false
+        }
 
         return points.contentEquals(other.points)
     }
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/FeatureMapping.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/FeatureMapping.kt
index c13017d..99d988d2 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/FeatureMapping.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/FeatureMapping.kt
@@ -21,6 +21,7 @@
  * at that feature
  */
 internal typealias MeasuredFeatures = List<ProgressableFeature>
+
 internal data class ProgressableFeature(val progress: Float, val feature: Feature)
 
 /**
@@ -28,23 +29,49 @@
  */
 internal fun featureMapper(features1: MeasuredFeatures, features2: MeasuredFeatures): DoubleMapper {
     // We only use corners for this mapping.
-    val filteredFeatures1 = features1.filter { it.feature is Feature.Corner }
-    val filteredFeatures2 = features2.filter { it.feature is Feature.Corner }
+    val filteredFeatures1 = buildList {
+        // Performance: Builds the list by avoiding creating an unnecessary Iterator to iterate
+        // through the features1 List.
+        for (i in features1.indices) {
+            if (features1[i].feature is Feature.Corner) {
+                add(features1[i])
+            }
+        }
+    }
+    val filteredFeatures2 = buildList {
+        // Performance: Builds the list by avoiding creating an unnecessary Iterator to iterate
+        // through the features2 List.
+        for (i in features2.indices) {
+            if (features2[i].feature is Feature.Corner) {
+                add(features2[i])
+            }
+        }
+    }
 
     val (m1, m2) = if (filteredFeatures1.size > filteredFeatures2.size) {
         doMapping(filteredFeatures2, filteredFeatures1) to filteredFeatures2
     } else {
         filteredFeatures1 to doMapping(filteredFeatures1, filteredFeatures2)
     }
-    val mm = m1.zip(m2).map { (f1, f2) -> f1.progress to f2.progress }
 
-    debugLog(LOG_TAG) { mm.joinToString { "${it.first} -> ${it.second}" } }
+    // Performance: Equivalent to `m1.zip(m2).map { (f1, f2) -> f1.progress to f2.progress }` and
+    // done to zip and create a Pairs list without creating unnecessary Iterators.
+    val mm = buildList {
+        for (i in m1.indices) {
+            if (i == m2.size) break
+            add(m1[i].progress to m2[i].progress)
+        }
+    }
+
+    debugLog(LOG_TAG) {
+        mm.joinToString { "${it.first} -> ${it.second}" }
+    }
     return DoubleMapper(*mm.toTypedArray()).also { dm ->
         debugLog(LOG_TAG) {
             val N = 10
             "Map: " +
                 (0..N).joinToString { i -> "%.3f".format(dm.map(i.toFloat() / N)) } +
-            "\nMb : " +
+                "\nMb : " +
                 (0..N).joinToString { i -> "%.3f".format(dm.mapBack(i.toFloat() / N)) }
         }
     }
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Features.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Features.kt
index 8d2774d..a9b438b 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Features.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Features.kt
@@ -32,7 +32,15 @@
      */
     internal class Edge(cubics: List<Cubic>) : Feature(cubics) {
         override fun transformed(f: PointTransformer) =
-            Edge(cubics.map { it.transformed(f) })
+            Edge(
+                buildList {
+                    // Performance: Builds the list by avoiding creating an unnecessary Iterator to
+                    // iterate through the cubics List.
+                    for (i in cubics.indices) {
+                        add(cubics[i].transformed(f))
+                    }
+                }
+            )
 
         override fun toString(): String = "Edge"
     }
@@ -52,7 +60,13 @@
     ) : Feature(cubics) {
         override fun transformed(f: PointTransformer): Feature {
             return Corner(
-                cubics.map { it.transformed(f = f) },
+                buildList {
+                    // Performance: Builds the list by avoiding creating an unnecessary Iterator to
+                    // iterate through the cubics List.
+                    for (i in cubics.indices) {
+                        add(cubics[i].transformed(f))
+                    }
+                },
                 vertex.transformed(f),
                 roundedCenter.transformed(f),
                 convex
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/FloatMapping.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/FloatMapping.kt
index 194520d..7abdc20 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/FloatMapping.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/FloatMapping.kt
@@ -16,6 +16,9 @@
 
 package androidx.graphics.shapes
 
+import androidx.collection.FloatList
+import androidx.collection.MutableFloatList
+
 /**
  * Checks if the given progress is in the given progress range, since progress is in the [0..1)
  * interval, and wraps, there is a special case when progressTo < progressFrom.
@@ -32,7 +35,7 @@
  * Maps from one set of progress values to another. This is used by DoubleMapper to retrieve the
  * value on one shape that maps to the appropriate value on the other.
  */
-internal fun linearMap(xValues: List<Float>, yValues: List<Float>, x: Float): Float {
+internal fun linearMap(xValues: FloatList, yValues: FloatList, x: Float): Float {
     require(x in 0f..1f) { "Invalid progress: $x" }
     val segmentStartIndex = xValues.indices.first {
         progressInRange(x, xValues[it], xValues[(it + 1) % xValues.size])
@@ -75,10 +78,14 @@
  * used to insert new curves and match curves overall.
  */
 internal class DoubleMapper(vararg mappings: Pair<Float, Float>) {
-    private val sourceValues = mappings.map { it.first }
-    private val targetValues = mappings.map { it.second }
+    private val sourceValues = MutableFloatList(mappings.size)
+    private val targetValues = MutableFloatList(mappings.size)
 
     init {
+        for (i in mappings.indices) {
+            sourceValues.add(mappings[i].first)
+            targetValues.add(mappings[i].second)
+        }
         validateProgress(sourceValues)
         validateProgress(targetValues)
     }
@@ -98,8 +105,9 @@
     }
 }
 
-internal fun validateProgress(p: List<Float>) {
-    require(p.all { it in 0f..1f }) {
+// TODO(performance): Make changes to satisfy the lint warnings for unnecessary iterators creation.
+internal fun validateProgress(p: FloatList) {
+    require(p.fold(true) { res, curr -> res && curr in 0f..1f }) {
         "FloatMapping - Progress outside of range: " + p.joinToString()
     }
     val wraps = (1 until p.size).count { p[it] < p[it - 1] }
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Morph.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Morph.kt
index 5aaef6c..d44d4a9 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Morph.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Morph.kt
@@ -62,14 +62,18 @@
      * values close to (but outside) the range can be used to get an exaggerated effect
      * (e.g., for a bounce or overshoot animation).
      */
-    fun asCubics(progress: Float) = _morphMatch.map { match ->
-        Cubic(FloatArray(8) {
-            interpolate(
-                match.first.points[it],
-                match.second.points[it],
-                progress
-            )
-        })
+    fun asCubics(progress: Float): List<Cubic> {
+        return buildList {
+            for (i in _morphMatch.indices) {
+                Cubic(FloatArray(8) {
+                    interpolate(
+                        _morphMatch[i].first.points[it],
+                        _morphMatch[i].second.points[it],
+                        progress
+                    )
+                })
+            }
+        }
     }
 
     /**
@@ -95,9 +99,9 @@
         progress: Float,
         mutableCubic: MutableCubic = MutableCubic(),
         callback: (MutableCubic) -> Unit
-        ) {
-        morphMatch.forEach { match ->
-            mutableCubic.interpolate(match.first, match.second, progress)
+    ) {
+        for (i in morphMatch.indices) {
+            mutableCubic.interpolate(morphMatch[i].first, morphMatch[i].second, progress)
             callback(mutableCubic)
         }
     }
@@ -122,26 +126,32 @@
             p1: RoundedPolygon,
             p2: RoundedPolygon
         ): List<Pair<Cubic, Cubic>> {
+            // TODO Commented out due to the use of javaClass ("Error: Platform reference in a
+            //  common module")
+            /*
             if (DEBUG) {
-                repeat(2) { polyIndex ->
-                    debugLog(LOG_TAG) {
-                        listOf("Initial start:\n", "Initial end:\n")[polyIndex] +
-                            listOf(p1, p2)[polyIndex].features.joinToString("\n") { feature ->
-                                "${feature.javaClass.name.split("$").last()} - " +
-                                    ((feature as? Feature.Corner)?.convex?.let {
-                                        if (it) "Convex - " else "Concave - " } ?: "") +
-                                    feature.cubics.joinToString("|")
-                            }
-                    }
-                }
+               repeat(2) { polyIndex ->
+                   debugLog(LOG_TAG) {
+                       listOf("Initial start:\n", "Initial end:\n")[polyIndex] +
+                           listOf(p1, p2)[polyIndex].features.joinToString("\n") { feature ->
+                               "${feature.javaClass.name.split("$").last()} - " +
+                                   ((feature as? Feature.Corner)?.convex?.let {
+                                       if (it) "Convex - " else "Concave - " } ?: "") +
+                                   feature.cubics.joinToString("|")
+                           }
+                   }
+               }
             }
+            */
 
             // Measure polygons, returns lists of measured cubics for each polygon, which
             // we then use to match start/end curves
             val measuredPolygon1 = MeasuredPolygon.measurePolygon(
-                AngleMeasurer(p1.centerX, p1.centerY), p1)
+                AngleMeasurer(p1.centerX, p1.centerY), p1
+            )
             val measuredPolygon2 = MeasuredPolygon.measurePolygon(
-                AngleMeasurer(p2.centerX, p2.centerY), p2)
+                AngleMeasurer(p2.centerX, p2.centerY), p2
+            )
 
             // features1 and 2 will contain the list of corners (just the inner circular curve)
             // along with the progress at the middle of those corners. These measurement values
@@ -200,7 +210,7 @@
                 )
                 val minb = min(b1a, b2a)
                 debugLog(LOG_TAG) { "$b1a $b2a | $minb" }
-                // minb is the progress at which the curve that ends first ends.
+                // min b is the progress at which the curve that ends first ends.
                 // If both curves ends roughly there, no cutting is needed, we have a match.
                 // If one curve extends beyond, we need to cut it.
                 val (seg1, newb1) = if (b1a > minb + AngleEpsilon) {
@@ -220,7 +230,9 @@
                 b1 = newb1
                 b2 = newb2
             }
-            require(b1 == null && b2 == null)
+            require(b1 == null && b2 == null) {
+                "Expected both Polygon's Cubic to be fully matched"
+            }
 
             if (DEBUG) {
                 // Export as SVG path.
@@ -230,8 +242,12 @@
                 repeat(2) { listIx ->
                     val points = ret.map { if (listIx == 0) it.first else it.second }
                     debugLog(LOG_TAG) {
-                        "M " + showPoint(Point(points.first().anchor0X,
-                            points.first().anchor0Y)) + " " +
+                        "M " + showPoint(
+                            Point(
+                                points.first().anchor0X,
+                                points.first().anchor0Y
+                            )
+                        ) + " " +
                             points.joinToString(" ") {
                                 "C " + showPoint(Point(it.control0X, it.control0Y)) + ", " +
                                     showPoint(Point(it.control1X, it.control1Y)) + ", " +
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Point.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Point.kt
index d50811b..702089c 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Point.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Point.kt
@@ -60,7 +60,7 @@
  */
 internal fun Point.getDirection() = run {
     val d = this.getDistance()
-    require(d > 0f)
+    require(d > 0f) { "Can't get the direction of a 0-length vector" }
     this / d
 }
 
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/PolygonMeasure.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/PolygonMeasure.kt
index 6c1c032..d8636f1 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/PolygonMeasure.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/PolygonMeasure.kt
@@ -17,6 +17,8 @@
 package androidx.graphics.shapes
 
 import androidx.annotation.FloatRange
+import androidx.collection.FloatList
+import androidx.collection.MutableFloatList
 import kotlin.math.abs
 
 internal class MeasuredPolygon : AbstractList<MeasuredPolygon.MeasuredCubic> {
@@ -28,11 +30,17 @@
         measurer: Measurer,
         features: List<ProgressableFeature>,
         cubics: List<Cubic>,
-        outlineProgress: List<Float>
+        outlineProgress: FloatList
     ) {
-        require(outlineProgress.size == cubics.size + 1)
-        require(outlineProgress.first() == 0f)
-        require(outlineProgress.last() == 1f)
+        require(outlineProgress.size == cubics.size + 1) {
+            "Outline progress size is expected to be the cubics size + 1"
+        }
+        require(outlineProgress.first() == 0f) {
+            "First outline progress value is expected to be zero"
+        }
+        require(outlineProgress.last() == 1f) {
+            "Last outline progress value is expected to be one"
+        }
         this.measurer = measurer
         this.features = features
 
@@ -44,14 +52,16 @@
         }
         val measuredCubics = mutableListOf<MeasuredCubic>()
         var startOutlineProgress = 0f
-        cubics.forEachIndexed { index, cubic ->
+        for (index in cubics.indices) {
             // Filter out "empty" cubics
             if ((outlineProgress[index + 1] - outlineProgress[index]) > DistanceEpsilon) {
-                measuredCubics.add(MeasuredCubic(
-                    cubic,
-                    startOutlineProgress,
-                    outlineProgress[index + 1]
-                ))
+                measuredCubics.add(
+                    MeasuredCubic(
+                        cubics[index],
+                        startOutlineProgress,
+                        outlineProgress[index + 1]
+                    )
+                )
                 // The next measured cubic will start exactly where this one ends.
                 startOutlineProgress = outlineProgress[index + 1]
             }
@@ -76,7 +86,9 @@
         @FloatRange(from = 0.0, to = 1.0) endOutlineProgress: Float,
     ) {
         init {
-            require(endOutlineProgress >= startOutlineProgress)
+            require(endOutlineProgress >= startOutlineProgress) {
+                "endOutlineProgress is expected to be equal or greater than startOutlineProgress"
+            }
         }
 
         val measuredSize = measurer.measureCubic(cubic)
@@ -91,7 +103,9 @@
             startOutlineProgress: Float = this.startOutlineProgress,
             endOutlineProgress: Float = this.endOutlineProgress
         ) {
-            require(endOutlineProgress >= startOutlineProgress)
+            require(endOutlineProgress >= startOutlineProgress) {
+                "endOutlineProgress is expected to be equal or greater than startOutlineProgress"
+            }
             this.startOutlineProgress = startOutlineProgress
             this.endOutlineProgress = endOutlineProgress
         }
@@ -114,7 +128,9 @@
             // called.
             val relativeMidProgress = mid / outlineProgressSize
             val t = measurer.findCubicCutPoint(cubic, relativeMidProgress * measuredSize)
-            require(t in 0f..1f)
+            require(t in 0f..1f) {
+                "Cubic cut point is expected to be between 0 and 1"
+            }
 
             debugLog(LOG_TAG) {
                 "cutAtProgress: progress = $cutOutlineProgress / " +
@@ -161,10 +177,11 @@
     fun cutAndShift(
         cuttingPoint: Float
     ): MeasuredPolygon {
-        require(cuttingPoint in 0f..1f)
+        require(cuttingPoint in 0f..1f) {
+            "Cutting point is expected to be between 0 and 1"
+        }
         if (cuttingPoint < DistanceEpsilon) return this
 
-        val n = cubics.size
         // Find the index of cubic we want to cut
         val targetIndex = cubics.indexOfFirst {
             cuttingPoint in it.startOutlineProgress..it.endOutlineProgress
@@ -189,7 +206,7 @@
         //   target cubic
         // * The first part of the target cubic (before the cut)
         val retCubics = mutableListOf(b2.cubic)
-        for (i in 1 until n) {
+        for (i in 1 until cubics.size) {
             retCubics.add(cubics[(i + targetIndex) % cubics.size].cubic)
         }
         retCubics.add(b1.cubic)
@@ -203,20 +220,30 @@
         // then 0.8 - 0.6 = 0.2, then 1 - 0.6 = 0.4, then 0.3 - 0.6 + 1 = 0.7,
         // then 1 (the cutting point again),
         // all together: (0.0, 0.2, 0.4, 0.7, 1.0)
-        val retOutlineProgress = Array(cubics.size + 2) { index ->
-            when (index) {
-                0 -> 0f
-                cubics.size + 1 -> 1f
-                else -> {
-                    val cubicIndex = (targetIndex + index - 1) % cubics.size
-                    positiveModulo(cubics[cubicIndex].endOutlineProgress - cuttingPoint, 1f)
+        val retOutlineProgress = MutableFloatList(cubics.size + 2)
+        for (index in 0 until cubics.size + 2) {
+            retOutlineProgress.add(
+                when (index) {
+                    0 -> 0f
+                    cubics.size + 1 -> 1f
+                    else -> {
+                        val cubicIndex = (targetIndex + index - 1) % cubics.size
+                        positiveModulo(cubics[cubicIndex].endOutlineProgress - cuttingPoint, 1f)
+                    }
                 }
-            }
-        }.asList()
+            )
+        }
 
         // Shift the feature's outline progress too.
-        val newFeatures = features.map { (outlineProgress, feature) ->
-            ProgressableFeature(positiveModulo(outlineProgress - cuttingPoint, 1f), feature)
+        val newFeatures = buildList {
+            for (i in features.indices) {
+                add(
+                    ProgressableFeature(
+                        positiveModulo(features[i].progress - cuttingPoint, 1f),
+                        features[i].feature
+                    )
+                )
+            }
         }
 
         // Filter out all empty cubics (i.e. start and end anchor are (almost) the same point.)
@@ -236,27 +263,44 @@
 
             // Get the cubics from the polygon, at the same time, extract the features and keep a
             // reference to the representative cubic we will use.
-            polygon.features.forEach { feature ->
-                feature.cubics.forEachIndexed { index, cubic ->
-                    if (feature is Feature.Corner &&
-                        index == feature.cubics.size / 2) {
+            for (featureIndex in polygon.features.indices) {
+                val feature = polygon.features[featureIndex]
+                for (cubicIndex in feature.cubics.indices) {
+                    if (feature is Feature.Corner && cubicIndex == feature.cubics.size / 2) {
                         featureToCubic.add(feature to cubics.size)
                     }
-                    cubics.add(cubic)
+                    cubics.add(feature.cubics[cubicIndex])
                 }
             }
+            // TODO(performance): Make changes to satisfy the lint warnings for unnecessary
+            //  iterators creation.
             val measures = cubics.scan(0f) { measure, cubic ->
-                measure + measurer.measureCubic(cubic).also { require(it >= 0f) }
+                measure + measurer.measureCubic(cubic).also {
+                    require(it >= 0f) {
+                        "Measured cubic is expected to be greater or equal to zero"
+                    }
+                }
             }
             val totalMeasure = measures.last()
-            val outlineProgress = measures.map { it / totalMeasure }
+
+            // Equivalent to `measures.map { it / totalMeasure }` but without Iterator allocation.
+            val outlineProgress = MutableFloatList(measures.size)
+            for (i in measures.indices) {
+                outlineProgress.add(measures[i] / totalMeasure)
+            }
 
             debugLog(LOG_TAG) { "Total size: $totalMeasure" }
 
-            val features = featureToCubic.map { featureAndIndex ->
-                val ix = featureAndIndex.second
-                ProgressableFeature((outlineProgress[ix] + outlineProgress[ix + 1]) / 2,
-                    featureAndIndex.first)
+            val features = buildList {
+                for (i in featureToCubic.indices) {
+                    val ix = featureToCubic[i].second
+                    add(
+                        ProgressableFeature(
+                            (outlineProgress[ix] + outlineProgress[ix + 1]) / 2,
+                            featureToCubic[i].first
+                        )
+                    )
+                }
             }
 
             return MeasuredPolygon(measurer, features, cubics, outlineProgress)
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/RoundedPolygon.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/RoundedPolygon.kt
index 409d521..375ab64 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/RoundedPolygon.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/RoundedPolygon.kt
@@ -17,6 +17,7 @@
 package androidx.graphics.shapes
 
 import androidx.annotation.IntRange
+import androidx.collection.MutableFloatList
 import kotlin.math.abs
 import kotlin.math.max
 import kotlin.math.min
@@ -36,22 +37,31 @@
     /**
      * A flattened version of the [Feature]s, as a List<Cubic>.
      */
-    val cubics = features.flatMap { it.cubics }
+    val cubics = buildList {
+        // Equivalent to `features.flatMap { it.cubics }` but without Iterator allocation.
+        for (i in features.indices) {
+            addAll(features[i].cubics)
+        }
+    }
 
     init {
         var prevCubic = cubics[cubics.size - 1]
         debugLog("RoundedPolygon") { "Cubic-1 = $prevCubic" }
-        cubics.forEachIndexed { index, cubic ->
+        for (index in cubics.indices) {
+            val cubic = cubics[index]
             if (abs(cubic.anchor0X - prevCubic.anchor1X) > DistanceEpsilon ||
-                abs(cubic.anchor0Y - prevCubic.anchor1Y) > DistanceEpsilon) {
+                abs(cubic.anchor0Y - prevCubic.anchor1Y) > DistanceEpsilon
+            ) {
                 debugLog("RoundedPolygon") { "Cubic = $cubic" }
                 debugLog("RoundedPolygon") {
                     "Ix: $index | (${cubic.anchor0X},${cubic.anchor0Y}) vs " +
                         "$prevCubic"
                 }
-                throw IllegalArgumentException("RoundedPolygon must be contiguous, with the " +
-                    "anchor points of all curves matching the anchor points of the preceding " +
-                    "and succeeding cubics")
+                throw IllegalArgumentException(
+                    "RoundedPolygon must be contiguous, with the " +
+                        "anchor points of all curves matching the anchor points of the preceding " +
+                        "and succeeding cubics"
+                )
             }
             prevCubic = cubic
         }
@@ -67,7 +77,15 @@
      */
     fun transformed(f: PointTransformer): RoundedPolygon {
         val center = Point(centerX, centerY).transformed(f)
-        return RoundedPolygon(features.map { it.transformed(f) }, center.x, center.y)
+        return RoundedPolygon(
+            buildList {
+                for (i in features.indices) {
+                    add(features[i].transformed(f))
+                }
+            },
+            center.x,
+            center.y
+        )
     }
 
     /**
@@ -96,12 +114,13 @@
      * This is a library-internal API, prefer the appropriate wrapper in your platform.
      */
     fun calculateBounds(bounds: FloatArray = FloatArray(4)): FloatArray {
-        require(bounds.size >= 4)
+        require(bounds.size >= 4) { "Required bounds size of 4" }
         var minX = Float.MAX_VALUE
         var minY = Float.MAX_VALUE
         var maxX = Float.MIN_VALUE
         var maxY = Float.MIN_VALUE
-        for (bezier in cubics) {
+        for (i in cubics.indices) {
+            val bezier = cubics[i]
             if (bezier.anchor0X < minX) minX = bezier.anchor0X
             if (bezier.anchor0Y < minY) minY = bezier.anchor0Y
             if (bezier.anchor0X > maxX) maxX = bezier.anchor0X
@@ -185,7 +204,8 @@
     rounding = rounding,
     perVertexRounding = perVertexRounding,
     centerX = centerX,
-    centerY = centerY)
+    centerY = centerY
+)
 
 /**
  * Creates a copy of the given [RoundedPolygon]
@@ -218,6 +238,8 @@
  * parameter has less than 6 Floats). Or if the [perVertexRounding] parameter is not null and the
  * size doesn't match the number vertices.
  */
+// TODO(performance): Update the map calls to more efficient code that doesn't allocate Iterators
+//  unnecessarily.
 @JvmOverloads
 fun RoundedPolygon(
     vertices: FloatArray,
@@ -233,8 +255,10 @@
         throw IllegalArgumentException("The vertices array should have even size")
     }
     if (perVertexRounding != null && perVertexRounding.size * 2 != vertices.size) {
-        throw IllegalArgumentException("perVertexRounding list should be either null or " +
-            "the same size as the number of vertices (vertices.size / 2)")
+        throw IllegalArgumentException(
+            "perVertexRounding list should be either null or " +
+                "the same size as the number of vertices (vertices.size / 2)"
+        )
     }
     val corners = mutableListOf<List<Cubic>>()
     val n = vertices.size / 2
@@ -286,10 +310,13 @@
     for (i in 0 until n) {
         // allowedCuts[0] is for the side from the previous corner to this one,
         // allowedCuts[1] is for the side from this corner to the next one.
-        val allowedCuts = (0..1).map { delta ->
+        val allowedCuts = MutableFloatList(2)
+        for (delta in 0..1) {
             val (roundCutRatio, cutRatio) = cutAdjusts[(i + n - 1 + delta) % n]
-            roundedCorners[i].expectedRoundCut * roundCutRatio +
-                (roundedCorners[i].expectedCut - roundedCorners[i].expectedRoundCut) * cutRatio
+            allowedCuts.add(
+                roundedCorners[i].expectedRoundCut * roundCutRatio +
+                    (roundedCorners[i].expectedCut - roundedCorners[i].expectedRoundCut) * cutRatio
+            )
         }
         corners.add(
             roundedCorners[i].getCubics(
@@ -397,17 +424,25 @@
 
     // cosine of angle at p1 is dot product of unit vectors to the other two vertices
     val cosAngle = d1.dotProduct(d2)
+
     // identity: sin^2 + cos^2 = 1
     // sinAngle gives us the intersection
     val sinAngle = sqrt(1 - square(cosAngle))
+
     // How much we need to cut, as measured on a side, to get the required radius
     // calculating where the rounding circle hits the edge
     // This uses the identity of tan(A/2) = sinA/(1 + cosA), where tan(A/2) = radius/cut
     val expectedRoundCut =
-        if (sinAngle > 1e-3) { cornerRadius * (cosAngle + 1) / sinAngle } else { 0f }
+        if (sinAngle > 1e-3) {
+            cornerRadius * (cosAngle + 1) / sinAngle
+        } else {
+            0f
+        }
+
     // smoothing changes the actual cut. 0 is same as expectedRoundCut, 1 doubles it
     val expectedCut: Float
         get() = ((1 + smoothing) * expectedRoundCut)
+
     // the center of the circle approximated by the rounding curve (or the middle of the three
     // curves if smoothing is requested). The center is the same as p0 if there is no rounding.
     var center: Point = Point(0f, 0f)
@@ -451,8 +486,10 @@
         ).reverse()
         return listOf(
             flanking0,
-            Cubic.circularArc(center.x, center.y, flanking0.anchor1X, flanking0.anchor1Y,
-                flanking2.anchor0X, flanking2.anchor0Y),
+            Cubic.circularArc(
+                center.x, center.y, flanking0.anchor1X, flanking0.anchor1Y,
+                flanking2.anchor0X, flanking2.anchor0Y
+            ),
             flanking2
         )
     }
@@ -509,9 +546,11 @@
         // We use an approximation to cut a part of the circle section proportional to 1 - smooth,
         // When smooth = 0, we take the full section, when smooth = 1, we take nothing.
         // TODO: revisit this, it can be problematic as it approaches 180 degrees
-        val p = interpolate(circleSegmentIntersection,
+        val p = interpolate(
+            circleSegmentIntersection,
             (circleSegmentIntersection + otherCircleSegmentIntersection) / 2f,
-            actualSmoothingValues)
+            actualSmoothingValues
+        )
         // The flanking curve ends on the circle
         val curveEnd = circleCenter +
             directionVector(p.x - circleCenter.x, p.y - circleCenter.y) * actualR
diff --git a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Utils.kt b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Utils.kt
index 0c3b2b0..90bcf2e 100644
--- a/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Utils.kt
+++ b/graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/Utils.kt
@@ -34,7 +34,7 @@
  */
 internal fun directionVector(x: Float, y: Float): Point {
     val d = distance(x, y)
-    require(d > 0f)
+    require(d > 0f) { "Required distance greater than zero" }
     return Point(x / d, y / d)
 }
 
@@ -83,14 +83,14 @@
     v0: Float,
     v1: Float,
     tolerance: Float = 1e-3f,
-    f: (Float) -> Float
+    f: FindMinimumFunction
 ): Float {
     var a = v0
     var b = v1
     while (b - a > tolerance) {
         val c1 = (2 * a + b) / 3
         val c2 = (2 * b + a) / 3
-        if (f(c1) < f(c2)) {
+        if (f.invoke(c1) < f.invoke(c2)) {
             b = c2
         } else {
             a = c1
@@ -99,6 +99,13 @@
     return (a + b) / 2
 }
 
+/**
+ * A functional interface for computing a Float value when finding the minimum at [findMinimum].
+ */
+internal fun interface FindMinimumFunction {
+    fun invoke(value: Float): Float
+}
+
 internal fun verticesFromNumVerts(
     numVertices: Int,
     radius: Float,
diff --git a/graphics/integration-tests/testapp-compose/build.gradle b/graphics/integration-tests/testapp-compose/build.gradle
index 733d526..18c6689 100644
--- a/graphics/integration-tests/testapp-compose/build.gradle
+++ b/graphics/integration-tests/testapp-compose/build.gradle
@@ -28,23 +28,21 @@
 
     implementation(project(":graphics:graphics-shapes"))
     implementation(project(':collection:collection'))
-
-    implementation("androidx.compose.ui:ui-graphics:1.5.0")
-    implementation("androidx.activity:activity-compose:1.3.1")
-    implementation("androidx.appcompat:appcompat:1.5.1")
-    implementation("androidx.compose.foundation:foundation:1.3.1")
-    implementation("androidx.compose.foundation:foundation-layout:1.3.1")
-    implementation("androidx.compose.material:material:1.4.0")
-    implementation("androidx.compose.runtime:runtime:1.3.3")
-    implementation("androidx.compose.ui:ui:1.3.3")
-    implementation("androidx.core:core-ktx:1.9.0")
-    implementation("androidx.fragment:fragment:1.5.6")
+    implementation(project(':compose:ui:ui'))
+    implementation("androidx.compose.ui:ui-graphics:1.5.3")
+    implementation("androidx.activity:activity-compose:1.8.0")
+    implementation("androidx.appcompat:appcompat:1.6.1")
+    implementation("androidx.compose.foundation:foundation:1.5.3")
+    implementation("androidx.compose.foundation:foundation-layout:1.5.3")
+    implementation("androidx.compose.material3:material3:1.1.2")
+    implementation("androidx.compose.runtime:runtime:1.5.3")
+    implementation("androidx.core:core-ktx:1.12.0")
+    implementation("androidx.fragment:fragment:1.6.1")
 }
 
 android {
-    namespace "androidx.graphics.shapes.testcompose"
-
     defaultConfig {
         minSdkVersion 21
     }
+    namespace "androidx.graphics.shapes.testcompose"
 }
diff --git a/graphics/integration-tests/testapp-compose/lint-baseline.xml b/graphics/integration-tests/testapp-compose/lint-baseline.xml
index e5a3396..b3f25c9 100644
--- a/graphics/integration-tests/testapp-compose/lint-baseline.xml
+++ b/graphics/integration-tests/testapp-compose/lint-baseline.xml
@@ -1,14 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-beta01" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-beta01)" variant="all" version="8.2.0-beta01">
-
-    <issue
-        id="PrimitiveInCollection"
-        message="variable sizedShapes with type Map&lt;Size, Sequence&lt;? extends Cubic>>: replace with LongObjectMap"
-        errorLine1="    val sizedShapes = remember(polygon) { mutableMapOf&lt;Size, Sequence&lt;Cubic>>() }"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/graphics/shapes/testcompose/MainActivity.kt"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="PrimitiveInLambda"
diff --git a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MainActivity.kt b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MainActivity.kt
index 6c9c28d..fd8e426 100644
--- a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MainActivity.kt
+++ b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MainActivity.kt
@@ -33,10 +33,10 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
-import androidx.compose.material.Button
-import androidx.compose.material.MaterialTheme
-import androidx.compose.material.Slider
-import androidx.compose.material.Text
+import androidx.compose.material3.Button
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Slider
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableIntState
 import androidx.compose.runtime.derivedStateOf
diff --git a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/PanZoomRotate.kt b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/PanZoomRotate.kt
index e251dfc8..81e44a9 100644
--- a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/PanZoomRotate.kt
+++ b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/PanZoomRotate.kt
@@ -19,8 +19,8 @@
 import androidx.compose.foundation.gestures.detectTransformGestures
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxScope
-import androidx.compose.material.Button
-import androidx.compose.material.Text
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableFloatStateOf
diff --git a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeEditor.kt b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeEditor.kt
index d668212..79f8b6d 100644
--- a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeEditor.kt
+++ b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeEditor.kt
@@ -27,9 +27,9 @@
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.width
-import androidx.compose.material.Button
-import androidx.compose.material.Slider
-import androidx.compose.material.Text
+import androidx.compose.material3.Button
+import androidx.compose.material3.Slider
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableFloatState
 import androidx.compose.runtime.derivedStateOf
diff --git a/graphics/integration-tests/testapp/build.gradle b/graphics/integration-tests/testapp/build.gradle
index 18bec58..b536543 100644
--- a/graphics/integration-tests/testapp/build.gradle
+++ b/graphics/integration-tests/testapp/build.gradle
@@ -29,5 +29,8 @@
 }
 
 android {
+    defaultConfig {
+        minSdkVersion 21
+    }
     namespace "androidx.graphics.shapes.test"
 }
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
index 9bc35b3..f8d943a 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
@@ -20,9 +20,13 @@
 import android.content.pm.PackageInfo
 import android.content.pm.PackageManager
 import android.os.Build
+import android.os.UserManager
 import androidx.annotation.ChecksSdkIntAtLeast
+import androidx.annotation.DoNotInline
 import androidx.annotation.IntDef
+import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
+import androidx.core.content.getSystemService
 import androidx.core.content.pm.PackageInfoCompat
 import androidx.health.connect.client.aggregate.AggregateMetric
 import androidx.health.connect.client.aggregate.AggregationResult
@@ -92,7 +96,7 @@
      *
      * @param records List of records to update
      * @throws android.os.RemoteException For any IPC transportation failures. Update with invalid
-     * identifiers will result in IPC failure.
+     *   identifiers will result in IPC failure.
      * @throws SecurityException For requests with unpermitted access.
      * @throws java.io.IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
@@ -108,8 +112,8 @@
      *   [Record] to delete
      * @param clientRecordIdsList List of client record IDs of [Record] to delete
      * @throws android.os.RemoteException For any IPC transportation failures. Deleting by invalid
-     * identifiers such as a non-existing identifier or deleting the same record multiple times will
-     * result in IPC failure.
+     *   identifiers such as a non-existing identifier or deleting the same record multiple times
+     *   will result in IPC failure.
      * @throws SecurityException For requests with unpermitted access.
      * @throws java.io.IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
@@ -150,7 +154,7 @@
      *   read
      * @return The [Record] data point.
      * @throws android.os.RemoteException For any IPC transportation failures. Update with invalid
-     * identifiers will result in IPC failure.
+     *   identifiers will result in IPC failure.
      * @throws SecurityException For requests with unpermitted access.
      * @throws java.io.IOException For any disk I/O issues.
      * @throws IllegalStateException If service is not available.
@@ -335,8 +339,8 @@
             else "androidx.health.ACTION_MANAGE_HEALTH_DATA"
 
         /**
-         * The Health Connect SDK is unavailable on this device at the time. This can be due to
-         * the device running a lower than required Android Version.
+         * The Health Connect SDK is unavailable on this device at the time. This can be due to the
+         * device running a lower than required Android Version.
          *
          * Apps should hide any integration points to Health Connect in this case.
          */
@@ -362,11 +366,11 @@
         @RestrictTo(RestrictTo.Scope.LIBRARY)
         @IntDef(
             value =
-            [
-                SDK_UNAVAILABLE,
-                SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED,
-                SDK_AVAILABLE,
-            ]
+                [
+                    SDK_UNAVAILABLE,
+                    SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED,
+                    SDK_AVAILABLE,
+                ]
         )
         annotation class AvailabilityStatus
 
@@ -375,7 +379,7 @@
          *
          * @param context the context
          * @param providerPackageName optional package provider to choose for backend implementation
-         * @return One of [SDK_UNAVAILABLE], [SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED] or
+         * @return One of [SDK_UNAVAILABLE], [SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED], or
          *   [SDK_AVAILABLE]
          * @sample androidx.health.connect.client.samples.AvailabilityCheckSamples
          */
@@ -386,7 +390,7 @@
             context: Context,
             providerPackageName: String = DEFAULT_PROVIDER_PACKAGE_NAME,
         ): Int {
-            if (!isSdkVersionSufficient()) {
+            if (!isSdkVersionSufficient() || isProfileInAndroidU(context)) {
                 return SDK_UNAVAILABLE
             }
             if (!isProviderAvailable(context, providerPackageName)) {
@@ -423,6 +427,7 @@
          *   implementation
          * @return instance of [HealthConnectClient] ready for issuing requests
          * @throws UnsupportedOperationException if service not available due to SDK version too low
+         *   or running in a profile
          * @throws IllegalStateException if service not available due to not installed
          * @see isProviderAvailable
          */
@@ -434,7 +439,7 @@
         ): HealthConnectClient {
             val status = getSdkStatus(context, providerPackageName)
             if (status == SDK_UNAVAILABLE) {
-                throw UnsupportedOperationException("SDK version too low")
+                throw UnsupportedOperationException("SDK version too low or running in a profile")
             }
             if (status == SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
                 throw IllegalStateException("Service not available")
@@ -468,12 +473,12 @@
         }
 
         /**
-         * Intent to open Health Connect data management screen on this phone. Developers
-         * should use this if they want to re-direct the user to Health Connect data management.
+         * Intent to open Health Connect data management screen on this phone. Developers should use
+         * this if they want to re-direct the user to Health Connect data management.
          *
          * @param context the context
          * @param providerPackageName optional alternative package provider to choose for backend
-         * implementation
+         *   implementation
          * @return Intent to open Health Connect data management screen.
          */
         @JvmOverloads
@@ -485,8 +490,9 @@
             val pm = context.packageManager
             val manageDataIntent = Intent(ACTION_HEALTH_CONNECT_MANAGE_DATA)
 
-            return if (isProviderAvailable(context, providerPackageName) &&
-                pm.resolveActivity(manageDataIntent, /* flags */ 0) != null
+            return if (
+                isProviderAvailable(context, providerPackageName) &&
+                    pm.resolveActivity(manageDataIntent, /* flags */ 0) != null
             ) {
                 manageDataIntent
             } else {
@@ -552,11 +558,22 @@
             return packageManager.queryIntentServices(bindIntent, 0).isNotEmpty()
         }
 
-        /**
-         * Tag used in SDK debug logs.
-         *
-         */
+        private fun isProfileInAndroidU(context: Context): Boolean {
+            return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &&
+                Api33Impl.isProfile(context)
+        }
+
+        /** Tag used in SDK debug logs. */
         @RestrictTo(RestrictTo.Scope.LIBRARY)
         internal const val HEALTH_CONNECT_CLIENT_TAG = "HealthConnectClient"
     }
+
+    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
+    private object Api33Impl {
+        @JvmStatic
+        @DoNotInline
+        fun isProfile(context: Context): Boolean {
+            return (context.getSystemService(Context.USER_SERVICE) as UserManager).isProfile
+        }
+    }
 }
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt
index 8ad0c67..f9d08c3 100644
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt
+++ b/health/connect/connect-client/src/test/java/androidx/health/connect/client/HealthConnectClientTest.kt
@@ -21,6 +21,7 @@
 import android.content.pm.ApplicationInfo
 import android.content.pm.PackageInfo
 import android.os.Build
+import android.os.UserManager
 import androidx.health.connect.client.impl.HealthConnectClientImpl
 import androidx.health.platform.client.HealthDataService
 import androidx.test.core.app.ApplicationProvider
@@ -123,11 +124,11 @@
         installService(context, HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME)
 
         assertThat(
-            HealthConnectClient.getSdkStatus(
-                context,
-                HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME
+                HealthConnectClient.getSdkStatus(
+                    context,
+                    HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME
+                )
             )
-        )
             .isEqualTo(HealthConnectClient.SDK_AVAILABLE)
         assertThat(HealthConnectClient.getOrCreate(context))
             .isInstanceOf(HealthConnectClientImpl::class.java)
@@ -146,11 +147,11 @@
         installService(context, HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME)
 
         assertThat(
-            HealthConnectClient.getSdkStatusLegacy(
-                context,
-                HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME
+                HealthConnectClient.getSdkStatusLegacy(
+                    context,
+                    HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME
+                )
             )
-        )
             .isEqualTo(HealthConnectClient.SDK_AVAILABLE)
         assertThat(HealthConnectClient.getOrCreateLegacy(context))
             .isInstanceOf(HealthConnectClientImpl::class.java)
@@ -181,9 +182,8 @@
     @Test
     @Config(sdk = [Build.VERSION_CODES.P])
     fun getHealthConnectManageDataAction_noProvider_returnsDefaultIntent() {
-        assertThat(HealthConnectClient.getHealthConnectManageDataIntent(context).action).isEqualTo(
-            HealthConnectClient.ACTION_HEALTH_CONNECT_SETTINGS
-        )
+        assertThat(HealthConnectClient.getHealthConnectManageDataIntent(context).action)
+            .isEqualTo(HealthConnectClient.ACTION_HEALTH_CONNECT_SETTINGS)
     }
 
     @Test
@@ -196,9 +196,8 @@
             enabled = true
         )
 
-        assertThat(HealthConnectClient.getHealthConnectManageDataIntent(context).action).isEqualTo(
-            HealthConnectClient.ACTION_HEALTH_CONNECT_SETTINGS
-        )
+        assertThat(HealthConnectClient.getHealthConnectManageDataIntent(context).action)
+            .isEqualTo(HealthConnectClient.ACTION_HEALTH_CONNECT_SETTINGS)
     }
 
     @Test
@@ -213,17 +212,46 @@
         installDataManagementHandler(context, HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME)
         installService(context, HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME)
 
-        assertThat(HealthConnectClient.getHealthConnectManageDataIntent(context).action).isEqualTo(
-            "androidx.health.ACTION_MANAGE_HEALTH_DATA"
-        )
+        assertThat(HealthConnectClient.getHealthConnectManageDataIntent(context).action)
+            .isEqualTo("androidx.health.ACTION_MANAGE_HEALTH_DATA")
     }
 
     @Test
     @Config(minSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
     fun getHealthConnectManageDataAction_platformSupported() {
-        assertThat(HealthConnectClient.getHealthConnectManageDataIntent(context).action).isEqualTo(
-            "android.health.connect.action.MANAGE_HEALTH_DATA"
+        assertThat(HealthConnectClient.getHealthConnectManageDataIntent(context).action)
+            .isEqualTo("android.health.connect.action.MANAGE_HEALTH_DATA")
+    }
+
+    // TODO(b/306157011): Add tests for work profile in Android U.
+    @Test
+    @Config(sdk = [Build.VERSION_CODES.TIRAMISU])
+    fun getSdkStatus_withProfileInT_isAvailable() {
+        installPackage(
+            context,
+            HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME,
+            versionCode = HealthConnectClient.DEFAULT_PROVIDER_MIN_VERSION_CODE,
+            enabled = true
         )
+        installService(context, HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME)
+
+        val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager
+        shadowOf(userManager).setManagedProfile(true)
+
+        assertThat(
+                HealthConnectClient.getSdkStatus(
+                    context,
+                    HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME
+                )
+            )
+            .isEqualTo(HealthConnectClient.SDK_AVAILABLE)
+        assertThat(
+                HealthConnectClient.getOrCreate(
+                    context,
+                    HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME
+                )
+            )
+            .isNotNull()
     }
 
     private fun installPackage(
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
index bbcd58e..c70f09f 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
@@ -79,7 +79,8 @@
                     )
                 } else {
                     resultFuture.setException(HealthServicesException(
-                            "DataType for the requested passive goal is not tracked"
+                            "Service registration failed: DataType for the requested " +
+                            "passive goal must be tracked"
                         ))
                 }
             },
@@ -116,7 +117,8 @@
                 } else {
                     result.setException(
                         HealthServicesException(
-                            "DataType for the requested passive goal is not tracked"
+                            "Callback registration failed: DataType for the requested " +
+                            "passive goal must be tracked"
                         )
                     )
                 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java
index e69936c..de270b0 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java
@@ -163,7 +163,7 @@
         if (mServiceConnectionRetry < MAX_RETRIES) {
             Log.w(
                     TAG,
-                    "WCS SDK Client '"
+                    "HealthServices SDK Client '"
                             + mConnectionConfiguration.getClientName()
                             + "' disconnected, retrying connection. Retry attempt: "
                             + mServiceConnectionRetry,
diff --git a/health/health-services-client/src/test/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClientTest.kt b/health/health-services-client/src/test/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClientTest.kt
index 45260e8..cd408a3 100644
--- a/health/health-services-client/src/test/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClientTest.kt
+++ b/health/health-services-client/src/test/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClientTest.kt
@@ -140,7 +140,8 @@
         assertThat(exception).isNotNull()
         assertThat(exception?.cause).isInstanceOf(HealthServicesException::class.java)
         assertThat(exception).hasMessageThat()
-            .contains("DataType for the requested passive goal is not tracked")
+            .contains("Service registration failed: DataType for the requested " +
+                "passive goal must be tracked")
     }
 
     @Test
@@ -182,7 +183,8 @@
         assertThat(fakeService.registerCallbackRequests).hasSize(0)
         assertThat(callback.onRegistrationFailedThrowables).hasSize(1)
         assertThat(callback.onRegistrationFailedThrowables[0]).hasMessageThat()
-            .contains("DataType for the requested passive goal is not tracked")
+            .contains("Callback registration failed: DataType for the requested " +
+                "passive goal must be tracked")
     }
 
     @Test
diff --git a/input/input-motionprediction/src/main/java/androidx/input/motionprediction/kalman/SinglePointerPredictor.java b/input/input-motionprediction/src/main/java/androidx/input/motionprediction/kalman/SinglePointerPredictor.java
index 61669c5..81abf52 100644
--- a/input/input-motionprediction/src/main/java/androidx/input/motionprediction/kalman/SinglePointerPredictor.java
+++ b/input/input-motionprediction/src/main/java/androidx/input/motionprediction/kalman/SinglePointerPredictor.java
@@ -50,7 +50,7 @@
     private static final float LOW_JANK = 0.02f;
     private static final float HIGH_JANK = 0.2f;
     private static final float ACCURATE_LOW_JANK = 0.1f;
-    private static final float ACCURATE_HIGH_JANK = 0.2f;
+    private static final float ACCURATE_HIGH_JANK = 0.7f;
 
     // Range of pen speed to expect (in dp / ms).
     // Low value will not use prediction, high value will use full prediction.
diff --git a/kruth/kruth/api/current.ignore b/kruth/kruth/api/current.ignore
index 2af69f7..04bc371 100644
--- a/kruth/kruth/api/current.ignore
+++ b/kruth/kruth/api/current.ignore
@@ -13,8 +13,14 @@
     Class androidx.kruth.StringSubject added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#contains(CharSequence):
     Method androidx.kruth.StringSubject.contains has added 'final' qualifier
+AddedFinal: androidx.kruth.StringSubject#containsMatch(String):
+    Method androidx.kruth.StringSubject.containsMatch has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#doesNotContain(CharSequence):
     Method androidx.kruth.StringSubject.doesNotContain has added 'final' qualifier
+AddedFinal: androidx.kruth.StringSubject#doesNotContainMatch(String):
+    Method androidx.kruth.StringSubject.doesNotContainMatch has added 'final' qualifier
+AddedFinal: androidx.kruth.StringSubject#doesNotMatch(String):
+    Method androidx.kruth.StringSubject.doesNotMatch has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#endsWith(String):
     Method androidx.kruth.StringSubject.endsWith has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#hasLength(int):
@@ -25,6 +31,8 @@
     Method androidx.kruth.StringSubject.isEmpty has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#isNotEmpty():
     Method androidx.kruth.StringSubject.isNotEmpty has added 'final' qualifier
+AddedFinal: androidx.kruth.StringSubject#matches(String):
+    Method androidx.kruth.StringSubject.matches has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#startsWith(String):
     Method androidx.kruth.StringSubject.startsWith has added 'final' qualifier
 AddedFinal: androidx.kruth.ThrowableSubject:
@@ -36,7 +44,7 @@
 ChangedType: androidx.kruth.StandardSubjectBuilder#about(androidx.kruth.Subject.Factory<? extends S,T>):
     Method androidx.kruth.StandardSubjectBuilder.about has changed return type from androidx.kruth.SimpleSubjectBuilder<S,A> to androidx.kruth.SimpleSubjectBuilder<S,T>
 ChangedType: androidx.kruth.StandardSubjectBuilder#fail():
-    Method androidx.kruth.StandardSubjectBuilder.fail has changed return type from void to Void
+    Method androidx.kruth.StandardSubjectBuilder.fail has changed return type from void to java.lang.Void
 ChangedType: androidx.kruth.StandardSubjectBuilder#that(Boolean):
     Method androidx.kruth.StandardSubjectBuilder.that has changed return type from androidx.kruth.ObjectArraySubject<T> to androidx.kruth.BooleanSubject
 ChangedType: androidx.kruth.StandardSubjectBuilder#that(Iterable<? extends T>):
@@ -46,7 +54,7 @@
 ChangedType: androidx.kruth.StandardSubjectBuilder#that(java.util.Map<K,? extends V>):
     Method androidx.kruth.StandardSubjectBuilder.that has changed return type from androidx.kruth.MapSubject to androidx.kruth.MapSubject<K,V>
 ChangedType: androidx.kruth.Subject#failWithActual(String, Object):
-    Method androidx.kruth.Subject.failWithActual has changed return type from void to Void
+    Method androidx.kruth.Subject.failWithActual has changed return type from void to java.lang.Void
 ChangedType: androidx.kruth.Subject.Factory#createSubject(androidx.kruth.FailureMetadata, ActualT):
     Method androidx.kruth.Subject.Factory.createSubject has changed return type from SubjectT (extends androidx.kruth.Subject) to SubjectT (extends androidx.kruth.Subject<? extends ActualT>)
 ChangedType: androidx.kruth.ThrowableSubject#hasCauseThat():
@@ -69,10 +77,18 @@
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter messageToPrepend in androidx.kruth.StandardSubjectBuilder.withMessage(String messageToPrepend)
 InvalidNullConversion: androidx.kruth.StringSubject#contains(CharSequence) parameter #0:
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter charSequence in androidx.kruth.StringSubject.contains(CharSequence charSequence)
+InvalidNullConversion: androidx.kruth.StringSubject#containsMatch(String) parameter #0:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter regex in androidx.kruth.StringSubject.containsMatch(String regex)
 InvalidNullConversion: androidx.kruth.StringSubject#doesNotContain(CharSequence) parameter #0:
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter string in androidx.kruth.StringSubject.doesNotContain(CharSequence string)
+InvalidNullConversion: androidx.kruth.StringSubject#doesNotContainMatch(String) parameter #0:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter regex in androidx.kruth.StringSubject.doesNotContainMatch(String regex)
+InvalidNullConversion: androidx.kruth.StringSubject#doesNotMatch(String) parameter #0:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter regex in androidx.kruth.StringSubject.doesNotMatch(String regex)
 InvalidNullConversion: androidx.kruth.StringSubject#endsWith(String) parameter #0:
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter string in androidx.kruth.StringSubject.endsWith(String string)
+InvalidNullConversion: androidx.kruth.StringSubject#matches(String) parameter #0:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter regex in androidx.kruth.StringSubject.matches(String regex)
 InvalidNullConversion: androidx.kruth.StringSubject#startsWith(String) parameter #0:
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter string in androidx.kruth.StringSubject.startsWith(String string)
 InvalidNullConversion: androidx.kruth.Subject.Factory#createSubject(androidx.kruth.FailureMetadata, ActualT) parameter #1:
@@ -167,20 +183,12 @@
     Removed method androidx.kruth.StandardSubjectBuilder.withMessage(String,java.lang.Object...)
 RemovedMethod: androidx.kruth.StringSubject#StringSubject(androidx.kruth.FailureMetadata, String):
     Removed constructor androidx.kruth.StringSubject(androidx.kruth.FailureMetadata,String)
-RemovedMethod: androidx.kruth.StringSubject#containsMatch(String):
-    Removed method androidx.kruth.StringSubject.containsMatch(String)
 RemovedMethod: androidx.kruth.StringSubject#containsMatch(java.util.regex.Pattern):
     Removed method androidx.kruth.StringSubject.containsMatch(java.util.regex.Pattern)
-RemovedMethod: androidx.kruth.StringSubject#doesNotContainMatch(String):
-    Removed method androidx.kruth.StringSubject.doesNotContainMatch(String)
 RemovedMethod: androidx.kruth.StringSubject#doesNotContainMatch(java.util.regex.Pattern):
     Removed method androidx.kruth.StringSubject.doesNotContainMatch(java.util.regex.Pattern)
-RemovedMethod: androidx.kruth.StringSubject#doesNotMatch(String):
-    Removed method androidx.kruth.StringSubject.doesNotMatch(String)
 RemovedMethod: androidx.kruth.StringSubject#doesNotMatch(java.util.regex.Pattern):
     Removed method androidx.kruth.StringSubject.doesNotMatch(java.util.regex.Pattern)
-RemovedMethod: androidx.kruth.StringSubject#matches(String):
-    Removed method androidx.kruth.StringSubject.matches(String)
 RemovedMethod: androidx.kruth.StringSubject#matches(java.util.regex.Pattern):
     Removed method androidx.kruth.StringSubject.matches(java.util.regex.Pattern)
 RemovedMethod: androidx.kruth.Subject#Subject(androidx.kruth.FailureMetadata, Object):
diff --git a/kruth/kruth/api/current.txt b/kruth/kruth/api/current.txt
index 1197de6..376f19d 100644
--- a/kruth/kruth/api/current.txt
+++ b/kruth/kruth/api/current.txt
@@ -173,12 +173,20 @@
 
   public final class StringSubject extends androidx.kruth.ComparableSubject<java.lang.String> {
     method public void contains(CharSequence charSequence);
+    method public void containsMatch(String regex);
+    method public void containsMatch(kotlin.text.Regex regex);
     method public void doesNotContain(CharSequence string);
+    method public void doesNotContainMatch(String regex);
+    method public void doesNotContainMatch(kotlin.text.Regex regex);
+    method public void doesNotMatch(String regex);
+    method public void doesNotMatch(kotlin.text.Regex regex);
     method public void endsWith(String string);
     method public void hasLength(int expectedLength);
     method public androidx.kruth.StringSubject.CaseInsensitiveStringComparison ignoringCase();
     method public void isEmpty();
     method public void isNotEmpty();
+    method public void matches(String regex);
+    method public void matches(kotlin.text.Regex regex);
     method public void startsWith(String string);
   }
 
diff --git a/kruth/kruth/api/restricted_current.ignore b/kruth/kruth/api/restricted_current.ignore
index 2af69f7..04bc371 100644
--- a/kruth/kruth/api/restricted_current.ignore
+++ b/kruth/kruth/api/restricted_current.ignore
@@ -13,8 +13,14 @@
     Class androidx.kruth.StringSubject added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#contains(CharSequence):
     Method androidx.kruth.StringSubject.contains has added 'final' qualifier
+AddedFinal: androidx.kruth.StringSubject#containsMatch(String):
+    Method androidx.kruth.StringSubject.containsMatch has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#doesNotContain(CharSequence):
     Method androidx.kruth.StringSubject.doesNotContain has added 'final' qualifier
+AddedFinal: androidx.kruth.StringSubject#doesNotContainMatch(String):
+    Method androidx.kruth.StringSubject.doesNotContainMatch has added 'final' qualifier
+AddedFinal: androidx.kruth.StringSubject#doesNotMatch(String):
+    Method androidx.kruth.StringSubject.doesNotMatch has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#endsWith(String):
     Method androidx.kruth.StringSubject.endsWith has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#hasLength(int):
@@ -25,6 +31,8 @@
     Method androidx.kruth.StringSubject.isEmpty has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#isNotEmpty():
     Method androidx.kruth.StringSubject.isNotEmpty has added 'final' qualifier
+AddedFinal: androidx.kruth.StringSubject#matches(String):
+    Method androidx.kruth.StringSubject.matches has added 'final' qualifier
 AddedFinal: androidx.kruth.StringSubject#startsWith(String):
     Method androidx.kruth.StringSubject.startsWith has added 'final' qualifier
 AddedFinal: androidx.kruth.ThrowableSubject:
@@ -36,7 +44,7 @@
 ChangedType: androidx.kruth.StandardSubjectBuilder#about(androidx.kruth.Subject.Factory<? extends S,T>):
     Method androidx.kruth.StandardSubjectBuilder.about has changed return type from androidx.kruth.SimpleSubjectBuilder<S,A> to androidx.kruth.SimpleSubjectBuilder<S,T>
 ChangedType: androidx.kruth.StandardSubjectBuilder#fail():
-    Method androidx.kruth.StandardSubjectBuilder.fail has changed return type from void to Void
+    Method androidx.kruth.StandardSubjectBuilder.fail has changed return type from void to java.lang.Void
 ChangedType: androidx.kruth.StandardSubjectBuilder#that(Boolean):
     Method androidx.kruth.StandardSubjectBuilder.that has changed return type from androidx.kruth.ObjectArraySubject<T> to androidx.kruth.BooleanSubject
 ChangedType: androidx.kruth.StandardSubjectBuilder#that(Iterable<? extends T>):
@@ -46,7 +54,7 @@
 ChangedType: androidx.kruth.StandardSubjectBuilder#that(java.util.Map<K,? extends V>):
     Method androidx.kruth.StandardSubjectBuilder.that has changed return type from androidx.kruth.MapSubject to androidx.kruth.MapSubject<K,V>
 ChangedType: androidx.kruth.Subject#failWithActual(String, Object):
-    Method androidx.kruth.Subject.failWithActual has changed return type from void to Void
+    Method androidx.kruth.Subject.failWithActual has changed return type from void to java.lang.Void
 ChangedType: androidx.kruth.Subject.Factory#createSubject(androidx.kruth.FailureMetadata, ActualT):
     Method androidx.kruth.Subject.Factory.createSubject has changed return type from SubjectT (extends androidx.kruth.Subject) to SubjectT (extends androidx.kruth.Subject<? extends ActualT>)
 ChangedType: androidx.kruth.ThrowableSubject#hasCauseThat():
@@ -69,10 +77,18 @@
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter messageToPrepend in androidx.kruth.StandardSubjectBuilder.withMessage(String messageToPrepend)
 InvalidNullConversion: androidx.kruth.StringSubject#contains(CharSequence) parameter #0:
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter charSequence in androidx.kruth.StringSubject.contains(CharSequence charSequence)
+InvalidNullConversion: androidx.kruth.StringSubject#containsMatch(String) parameter #0:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter regex in androidx.kruth.StringSubject.containsMatch(String regex)
 InvalidNullConversion: androidx.kruth.StringSubject#doesNotContain(CharSequence) parameter #0:
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter string in androidx.kruth.StringSubject.doesNotContain(CharSequence string)
+InvalidNullConversion: androidx.kruth.StringSubject#doesNotContainMatch(String) parameter #0:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter regex in androidx.kruth.StringSubject.doesNotContainMatch(String regex)
+InvalidNullConversion: androidx.kruth.StringSubject#doesNotMatch(String) parameter #0:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter regex in androidx.kruth.StringSubject.doesNotMatch(String regex)
 InvalidNullConversion: androidx.kruth.StringSubject#endsWith(String) parameter #0:
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter string in androidx.kruth.StringSubject.endsWith(String string)
+InvalidNullConversion: androidx.kruth.StringSubject#matches(String) parameter #0:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter regex in androidx.kruth.StringSubject.matches(String regex)
 InvalidNullConversion: androidx.kruth.StringSubject#startsWith(String) parameter #0:
     Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter string in androidx.kruth.StringSubject.startsWith(String string)
 InvalidNullConversion: androidx.kruth.Subject.Factory#createSubject(androidx.kruth.FailureMetadata, ActualT) parameter #1:
@@ -167,20 +183,12 @@
     Removed method androidx.kruth.StandardSubjectBuilder.withMessage(String,java.lang.Object...)
 RemovedMethod: androidx.kruth.StringSubject#StringSubject(androidx.kruth.FailureMetadata, String):
     Removed constructor androidx.kruth.StringSubject(androidx.kruth.FailureMetadata,String)
-RemovedMethod: androidx.kruth.StringSubject#containsMatch(String):
-    Removed method androidx.kruth.StringSubject.containsMatch(String)
 RemovedMethod: androidx.kruth.StringSubject#containsMatch(java.util.regex.Pattern):
     Removed method androidx.kruth.StringSubject.containsMatch(java.util.regex.Pattern)
-RemovedMethod: androidx.kruth.StringSubject#doesNotContainMatch(String):
-    Removed method androidx.kruth.StringSubject.doesNotContainMatch(String)
 RemovedMethod: androidx.kruth.StringSubject#doesNotContainMatch(java.util.regex.Pattern):
     Removed method androidx.kruth.StringSubject.doesNotContainMatch(java.util.regex.Pattern)
-RemovedMethod: androidx.kruth.StringSubject#doesNotMatch(String):
-    Removed method androidx.kruth.StringSubject.doesNotMatch(String)
 RemovedMethod: androidx.kruth.StringSubject#doesNotMatch(java.util.regex.Pattern):
     Removed method androidx.kruth.StringSubject.doesNotMatch(java.util.regex.Pattern)
-RemovedMethod: androidx.kruth.StringSubject#matches(String):
-    Removed method androidx.kruth.StringSubject.matches(String)
 RemovedMethod: androidx.kruth.StringSubject#matches(java.util.regex.Pattern):
     Removed method androidx.kruth.StringSubject.matches(java.util.regex.Pattern)
 RemovedMethod: androidx.kruth.Subject#Subject(androidx.kruth.FailureMetadata, Object):
diff --git a/kruth/kruth/api/restricted_current.txt b/kruth/kruth/api/restricted_current.txt
index e0d14b8..d1d194d8a 100644
--- a/kruth/kruth/api/restricted_current.txt
+++ b/kruth/kruth/api/restricted_current.txt
@@ -173,12 +173,20 @@
 
   public final class StringSubject extends androidx.kruth.ComparableSubject<java.lang.String> {
     method public void contains(CharSequence charSequence);
+    method public void containsMatch(String regex);
+    method public void containsMatch(kotlin.text.Regex regex);
     method public void doesNotContain(CharSequence string);
+    method public void doesNotContainMatch(String regex);
+    method public void doesNotContainMatch(kotlin.text.Regex regex);
+    method public void doesNotMatch(String regex);
+    method public void doesNotMatch(kotlin.text.Regex regex);
     method public void endsWith(String string);
     method public void hasLength(int expectedLength);
     method public androidx.kruth.StringSubject.CaseInsensitiveStringComparison ignoringCase();
     method public void isEmpty();
     method public void isNotEmpty();
+    method public void matches(String regex);
+    method public void matches(kotlin.text.Regex regex);
     method public void startsWith(String string);
   }
 
diff --git a/kruth/kruth/src/commonMain/kotlin/androidx/kruth/StringSubject.kt b/kruth/kruth/src/commonMain/kotlin/androidx/kruth/StringSubject.kt
index d43cada..97e56c3 100644
--- a/kruth/kruth/src/commonMain/kotlin/androidx/kruth/StringSubject.kt
+++ b/kruth/kruth/src/commonMain/kotlin/androidx/kruth/StringSubject.kt
@@ -16,6 +16,9 @@
 
 package androidx.kruth
 
+import androidx.kruth.Fact.Companion.fact
+import androidx.kruth.Fact.Companion.simpleFact
+
 /**
  * Propositions for string subjects.
  */
@@ -109,11 +112,104 @@
         }
     }
 
+    /** Fails if the string does not match the given [regex]. */
+    fun matches(regex: String) {
+        matches(regex.toRegex()) {
+            "Looks like you want to use .isEqualTo() for an exact equality assertion."
+        }
+    }
+
+    /** Fails if the string does not match the given [regex]. */
+    fun matches(regex: Regex) {
+        matches(regex) {
+            "If you want an exact equality assertion you can escape your regex with Regex.escape()."
+        }
+    }
+
+    private inline fun matches(regex: Regex, equalToStringErrorMsg: () -> String) {
+        if (actual == null) {
+            failWithActual("Expected a string that matches", regex)
+        }
+
+        if (actual.matches(regex)) {
+            return
+        }
+
+        if (regex.toString() == actual) {
+            failWithoutActual(
+                fact("Expected to match", regex),
+                fact("but was", actual),
+                simpleFact(equalToStringErrorMsg()),
+            )
+        } else {
+            failWithActual("Expected to match", regex);
+        }
+    }
+
+    /** Fails if the string matches the given regex.  */
+    fun doesNotMatch(regex: String) {
+        doesNotMatch(regex.toRegex())
+    }
+
+    /** Fails if the string matches the given regex.  */
+    fun doesNotMatch(regex: Regex) {
+        if (actual == null) {
+            failWithActual("Expected a string that does not match", regex)
+        }
+
+        if (actual.matches(regex)) {
+            failWithActual("Expected not to match", regex)
+        }
+    }
+
+    /** Fails if the string does not contain a match on the given regex.  */
+    fun containsMatch(regex: Regex) {
+        if (actual == null) {
+            failWithActual("Expected a string that contains a match for", regex)
+        }
+
+        if (!regex.containsMatchIn(actual)) {
+            failWithActual("Expected to contain a match for", regex)
+        }
+    }
+
+    /** Fails if the string does not contain a match on the given regex.  */
+    fun containsMatch(regex: String) {
+        containsMatch(regex.toRegex())
+    }
+
+    /** Fails if the string contains a match on the given regex.  */
+    fun doesNotContainMatch(regex: Regex) {
+        if (actual == null) {
+            failWithActual("expected a string that does not contain a match for", regex)
+        }
+
+        val result = regex.find(actual)
+        if (result != null) {
+            failWithoutActual(
+                fact("Expected not to contain a match for", regex),
+                fact("but contained", result.value),
+                fact("Full string", actual)
+            )
+        }
+    }
+
+    /** Fails if the string contains a match on the given regex.  */
+    fun doesNotContainMatch(regex: String) {
+        if (actual == null) {
+            failWithActual("expected a string that does not contain a match for", regex)
+        }
+
+        if (regex.toRegex().containsMatchIn(actual)) {
+            failWithActual("expected not to contain a match for", regex)
+        }
+    }
+
     /**
      * Returns a [StringSubject]-like instance that will ignore the case of the characters.
      *
      * Character equality ignoring case is defined as follows: Characters must be equal either
-     * after calling [Character.toLowerCase] or after calling [Character.toUpperCase].
+     * after calling [Char.lowercaseChar] or after calling [Char.uppercaseChar].
      * Note that this is independent of any locale.
      */
     fun ignoringCase(): CaseInsensitiveStringComparison =
diff --git a/kruth/kruth/src/commonTest/kotlin/androidx/kruth/StringSubjectTest.kt b/kruth/kruth/src/commonTest/kotlin/androidx/kruth/StringSubjectTest.kt
index 21f7ff8..c0df0a0 100644
--- a/kruth/kruth/src/commonTest/kotlin/androidx/kruth/StringSubjectTest.kt
+++ b/kruth/kruth/src/commonTest/kotlin/androidx/kruth/StringSubjectTest.kt
@@ -164,6 +164,172 @@
     }
 
     @Test
+    fun stringMatchesString() {
+        assertThat("abcaaadev").matches(".*aaa.*")
+    }
+
+    @Test
+    fun stringMatchesStringWithFail() {
+        assertFailsWith<AssertionError> {
+            assertThat("abcaqadev").matches(".*aaa.*")
+        }
+    }
+
+    @Test
+    fun stringMatchesStringFailNull() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).matches(".*aaa.*")
+        }
+    }
+
+    @Test
+    fun stringMatchesStringLiteralFail() {
+        assertFailsWith<AssertionError> {
+            assertThat("\$abc").matches("\$abc")
+        }
+    }
+
+    @Test
+    fun stringMatchesPattern() {
+        assertThat("abcaaadev").matches(".*aaa.*".toRegex())
+    }
+
+    @Test
+    fun stringMatchesPatternWithFail() {
+        assertFailsWith<AssertionError> {
+            assertThat("abcaqadev").matches(".*aaa.*".toRegex())
+        }
+    }
+
+    @Test
+    fun stringMatchesPatternFailNull() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).matches(".*aaa.*".toRegex())
+        }
+    }
+
+    @Test
+    fun stringMatchesPatternLiteralFail() {
+        assertFailsWith<AssertionError> {
+            assertThat("\$abc").matches("\$abc".toRegex())
+        }
+    }
+
+    @Test
+    fun stringDoesNotMatchString() {
+        assertThat("abcaqadev").doesNotMatch(".*aaa.*")
+    }
+
+    @Test
+    fun stringDoesNotMatchStringWithFail() {
+        assertFailsWith<AssertionError> {
+            assertThat("abcaaadev").doesNotMatch(".*aaa.*")
+        }
+    }
+
+    @Test
+    fun stringDoesNotMatchStringFailNull() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).doesNotMatch(".*aaa.*")
+        }
+    }
+
+    @Test
+    fun stringDoesNotMatchPattern() {
+        assertThat("abcaqadev").doesNotMatch(".*aaa.*".toRegex())
+    }
+
+    @Test
+    fun stringDoesNotMatchPatternWithFail() {
+        assertFailsWith<AssertionError> {
+            assertThat("abcaaadev").doesNotMatch(".*aaa.*".toRegex())
+        }
+    }
+
+    @Test
+    fun stringDoesNotMatchPatternFailNull() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).doesNotMatch(".*aaa.*".toRegex())
+        }
+    }
+
+    @Test
+    fun stringContainsMatchStringUsesFind() {
+        assertThat("aba").containsMatch("[b]")
+        assertThat("aba").containsMatch("[b]".toRegex())
+    }
+
+    @Test
+    fun stringContainsMatchString() {
+        assertThat("aba").containsMatch(".*b.*")
+        assertFailsWith<AssertionError> {
+            assertThat("aaa").containsMatch(".*b.*")
+        }
+    }
+
+    @Test
+    fun stringContainsMatchStringFailNull() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).containsMatch(".*b.*")
+        }
+    }
+
+    @Test
+    fun stringContainsMatchPattern() {
+        assertThat("aba").containsMatch(".*b.*".toRegex())
+        assertFailsWith<AssertionError> {
+            assertThat("aaa").containsMatch(".*b.*".toRegex())
+        }
+    }
+
+    @Test
+    fun stringContainsMatchPatternFailNull() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).containsMatch(".*b.*".toRegex())
+        }
+    }
+
+    @Test
+    fun stringDoesNotContainMatchString() {
+        assertThat("aaa").doesNotContainMatch(".*b.*")
+        assertFailsWith<AssertionError> {
+            assertThat("aba").doesNotContainMatch(".*b.*")
+        }
+        assertFailsWith<AssertionError> {
+            assertThat("zzabazz").doesNotContainMatch(".b.")
+        }
+    }
+
+    @Test
+    fun stringDoesNotContainMatchStringUsesFind() {
+        assertFailsWith<AssertionError> {
+            assertThat("aba").doesNotContainMatch("[b]")
+        }
+    }
+
+    @Test
+    fun stringDoesNotContainMatchStringUsesFindFailNull() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).doesNotContainMatch("[b]")
+        }
+    }
+
+    @Test
+    fun stringDoesNotContainMatchPattern() {
+        assertThat("zzaaazz").doesNotContainMatch(".b.".toRegex())
+        assertFailsWith<AssertionError> {
+            assertThat("zzabazz").doesNotContainMatch(".b.".toRegex())
+        }
+    }
+
+    @Test
+    fun stringDoesNotContainMatchPatternFailNull() {
+        assertFailsWith<AssertionError> {
+            assertThat(null as String?).doesNotContainMatch(".b.".toRegex())
+        }
+    }
+
+    @Test
     fun stringEqualityIgnoringCase() {
         assertThat("café").ignoringCase().isEqualTo("CAFÉ")
     }
diff --git a/leanback/leanback-grid/build.gradle b/leanback/leanback-grid/build.gradle
index 061ccf3..1836aa1 100644
--- a/leanback/leanback-grid/build.gradle
+++ b/leanback/leanback-grid/build.gradle
@@ -45,9 +45,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 17
-    }
     namespace "androidx.leanback.widget"
 }
 
diff --git a/leanback/leanback/api/api_lint.ignore b/leanback/leanback/api/api_lint.ignore
index a568a48..19ff8fa 100644
--- a/leanback/leanback/api/api_lint.ignore
+++ b/leanback/leanback/api/api_lint.ignore
@@ -197,42 +197,8 @@
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
 MissingNullability: androidx.leanback.app.BaseSupportFragment#runEntranceTransition(Object) parameter #0:
     Missing nullability on parameter `entranceTransition` in method `runEntranceTransition`
-MissingNullability: androidx.leanback.app.BrandedFragment#getBadgeDrawable():
-    Missing nullability on method `getBadgeDrawable` return
-MissingNullability: androidx.leanback.app.BrandedFragment#getSearchAffordanceColors():
-    Missing nullability on method `getSearchAffordanceColors` return
-MissingNullability: androidx.leanback.app.BrandedFragment#getTitle():
-    Missing nullability on method `getTitle` return
-MissingNullability: androidx.leanback.app.BrandedFragment#getTitleView():
-    Missing nullability on method `getTitleView` return
-MissingNullability: androidx.leanback.app.BrandedFragment#getTitleViewAdapter():
-    Missing nullability on method `getTitleViewAdapter` return
-MissingNullability: androidx.leanback.app.BrandedFragment#installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `installTitleView`
-MissingNullability: androidx.leanback.app.BrandedFragment#installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `parent` in method `installTitleView`
-MissingNullability: androidx.leanback.app.BrandedFragment#installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `installTitleView`
-MissingNullability: androidx.leanback.app.BrandedFragment#onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onInflateTitleView` return
-MissingNullability: androidx.leanback.app.BrandedFragment#onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onInflateTitleView`
-MissingNullability: androidx.leanback.app.BrandedFragment#onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `parent` in method `onInflateTitleView`
-MissingNullability: androidx.leanback.app.BrandedFragment#onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onInflateTitleView`
 MissingNullability: androidx.leanback.app.BrandedFragment#onSaveInstanceState(android.os.Bundle) parameter #0:
     Missing nullability on parameter `outState` in method `onSaveInstanceState`
-MissingNullability: androidx.leanback.app.BrandedFragment#setBadgeDrawable(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `drawable` in method `setBadgeDrawable`
-MissingNullability: androidx.leanback.app.BrandedFragment#setOnSearchClickedListener(android.view.View.OnClickListener) parameter #0:
-    Missing nullability on parameter `listener` in method `setOnSearchClickedListener`
-MissingNullability: androidx.leanback.app.BrandedFragment#setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors) parameter #0:
-    Missing nullability on parameter `colors` in method `setSearchAffordanceColors`
-MissingNullability: androidx.leanback.app.BrandedFragment#setTitle(CharSequence) parameter #0:
-    Missing nullability on parameter `title` in method `setTitle`
-MissingNullability: androidx.leanback.app.BrandedFragment#setTitleView(android.view.View) parameter #0:
-    Missing nullability on parameter `titleView` in method `setTitleView`
 MissingNullability: androidx.leanback.app.BrowseFragment#createArgs(android.os.Bundle, String, int):
     Missing nullability on method `createArgs` return
 MissingNullability: androidx.leanback.app.BrowseFragment#createArgs(android.os.Bundle, String, int) parameter #0:
@@ -261,12 +227,8 @@
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
 MissingNullability: androidx.leanback.app.BrowseFragment#onCreateHeadersFragment():
     Missing nullability on method `onCreateHeadersFragment` return
-MissingNullability: androidx.leanback.app.BrowseFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
 MissingNullability: androidx.leanback.app.BrowseFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.BrowseFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.BrowseFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.BrowseFragment#onSaveInstanceState(android.os.Bundle) parameter #0:
@@ -347,14 +309,6 @@
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
 MissingNullability: androidx.leanback.app.BrowseSupportFragment#onCreateHeadersSupportFragment():
     Missing nullability on method `onCreateHeadersSupportFragment` return
-MissingNullability: androidx.leanback.app.BrowseSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
-MissingNullability: androidx.leanback.app.BrowseSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.BrowseSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
-MissingNullability: androidx.leanback.app.BrowseSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.BrowseSupportFragment#runEntranceTransition(Object) parameter #0:
     Missing nullability on parameter `entranceTransition` in method `runEntranceTransition`
 MissingNullability: androidx.leanback.app.BrowseSupportFragment#setAdapter(androidx.leanback.widget.ObjectAdapter) parameter #0:
@@ -415,22 +369,10 @@
     Missing nullability on method `getRowsFragment` return
 MissingNullability: androidx.leanback.app.DetailsFragment#onCreate(android.os.Bundle) parameter #0:
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.leanback.app.DetailsFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
 MissingNullability: androidx.leanback.app.DetailsFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.DetailsFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.DetailsFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
-MissingNullability: androidx.leanback.app.DetailsFragment#onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onInflateTitleView` return
-MissingNullability: androidx.leanback.app.DetailsFragment#onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onInflateTitleView`
-MissingNullability: androidx.leanback.app.DetailsFragment#onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `parent` in method `onInflateTitleView`
-MissingNullability: androidx.leanback.app.DetailsFragment#onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onInflateTitleView`
 MissingNullability: androidx.leanback.app.DetailsFragment#onSetDetailsOverviewRowStatus(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int) parameter #0:
     Missing nullability on parameter `presenter` in method `onSetDetailsOverviewRowStatus`
 MissingNullability: androidx.leanback.app.DetailsFragment#onSetDetailsOverviewRowStatus(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int) parameter #1:
@@ -481,14 +423,6 @@
     Missing nullability on method `getRowsSupportFragment` return
 MissingNullability: androidx.leanback.app.DetailsSupportFragment#onCreate(android.os.Bundle) parameter #0:
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.leanback.app.DetailsSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
-MissingNullability: androidx.leanback.app.DetailsSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.DetailsSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
-MissingNullability: androidx.leanback.app.DetailsSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.DetailsSupportFragment#onSetDetailsOverviewRowStatus(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int) parameter #0:
     Missing nullability on parameter `presenter` in method `onSetDetailsOverviewRowStatus`
 MissingNullability: androidx.leanback.app.DetailsSupportFragment#onSetDetailsOverviewRowStatus(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int) parameter #1:
@@ -527,126 +461,16 @@
     Missing nullability on method `onCreateVideoSupportFragment` return
 MissingNullability: androidx.leanback.app.DetailsSupportFragmentBackgroundController#setCoverBitmap(android.graphics.Bitmap) parameter #0:
     Missing nullability on parameter `bitmap` in method `setCoverBitmap`
-MissingNullability: androidx.leanback.app.ErrorFragment#getBackgroundDrawable():
-    Missing nullability on method `getBackgroundDrawable` return
-MissingNullability: androidx.leanback.app.ErrorFragment#getButtonClickListener():
-    Missing nullability on method `getButtonClickListener` return
-MissingNullability: androidx.leanback.app.ErrorFragment#getButtonText():
-    Missing nullability on method `getButtonText` return
-MissingNullability: androidx.leanback.app.ErrorFragment#getImageDrawable():
-    Missing nullability on method `getImageDrawable` return
-MissingNullability: androidx.leanback.app.ErrorFragment#getMessage():
-    Missing nullability on method `getMessage` return
-MissingNullability: androidx.leanback.app.ErrorFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
 MissingNullability: androidx.leanback.app.ErrorFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.ErrorFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.ErrorFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
-MissingNullability: androidx.leanback.app.ErrorFragment#setBackgroundDrawable(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `drawable` in method `setBackgroundDrawable`
-MissingNullability: androidx.leanback.app.ErrorFragment#setButtonClickListener(android.view.View.OnClickListener) parameter #0:
-    Missing nullability on parameter `clickListener` in method `setButtonClickListener`
-MissingNullability: androidx.leanback.app.ErrorFragment#setButtonText(String) parameter #0:
-    Missing nullability on parameter `text` in method `setButtonText`
-MissingNullability: androidx.leanback.app.ErrorFragment#setImageDrawable(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `drawable` in method `setImageDrawable`
-MissingNullability: androidx.leanback.app.ErrorFragment#setMessage(CharSequence) parameter #0:
-    Missing nullability on parameter `message` in method `setMessage`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#add(android.app.FragmentManager, androidx.leanback.app.GuidedStepFragment) parameter #0:
-    Missing nullability on parameter `fragmentManager` in method `add`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#add(android.app.FragmentManager, androidx.leanback.app.GuidedStepFragment) parameter #1:
-    Missing nullability on parameter `fragment` in method `add`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#add(android.app.FragmentManager, androidx.leanback.app.GuidedStepFragment, int) parameter #0:
-    Missing nullability on parameter `fragmentManager` in method `add`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#add(android.app.FragmentManager, androidx.leanback.app.GuidedStepFragment, int) parameter #1:
-    Missing nullability on parameter `fragment` in method `add`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#addAsRoot(android.app.Activity, androidx.leanback.app.GuidedStepFragment, int) parameter #0:
-    Missing nullability on parameter `activity` in method `addAsRoot`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#addAsRoot(android.app.Activity, androidx.leanback.app.GuidedStepFragment, int) parameter #1:
-    Missing nullability on parameter `fragment` in method `addAsRoot`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#expandAction(androidx.leanback.widget.GuidedAction, boolean) parameter #0:
-    Missing nullability on parameter `action` in method `expandAction`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#expandSubActions(androidx.leanback.widget.GuidedAction) parameter #0:
-    Missing nullability on parameter `action` in method `expandSubActions`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#findActionById(long):
-    Missing nullability on method `findActionById` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#findButtonActionById(long):
-    Missing nullability on method `findButtonActionById` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getActionItemView(int):
-    Missing nullability on method `getActionItemView` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getActions():
-    Missing nullability on method `getActions` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getButtonActionItemView(int):
-    Missing nullability on method `getButtonActionItemView` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getButtonActions():
-    Missing nullability on method `getButtonActions` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getCurrentGuidedStepFragment(android.app.FragmentManager):
-    Missing nullability on method `getCurrentGuidedStepFragment` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getCurrentGuidedStepFragment(android.app.FragmentManager) parameter #0:
-    Missing nullability on parameter `fm` in method `getCurrentGuidedStepFragment`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getGuidanceStylist():
-    Missing nullability on method `getGuidanceStylist` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getGuidedActionsStylist():
-    Missing nullability on method `getGuidedActionsStylist` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#getGuidedButtonActionsStylist():
-    Missing nullability on method `getGuidedButtonActionsStylist` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onAddSharedElementTransition(android.app.FragmentTransaction, androidx.leanback.app.GuidedStepFragment) parameter #0:
-    Missing nullability on parameter `ft` in method `onAddSharedElementTransition`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onAddSharedElementTransition(android.app.FragmentTransaction, androidx.leanback.app.GuidedStepFragment) parameter #1:
-    Missing nullability on parameter `disappearing` in method `onAddSharedElementTransition`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateActions(java.util.List<androidx.leanback.widget.GuidedAction>, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateActions`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateActionsStylist():
-    Missing nullability on method `onCreateActionsStylist` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateBackgroundView` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateBackgroundView`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateBackgroundView`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateBackgroundView`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateButtonActions(java.util.List<androidx.leanback.widget.GuidedAction>, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateButtonActions`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateButtonActionsStylist():
-    Missing nullability on method `onCreateButtonActionsStylist` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateGuidance(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateGuidance`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateGuidanceStylist():
-    Missing nullability on method `onCreateGuidanceStylist` return
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
 MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.GuidedStepFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onGuidedActionClicked(androidx.leanback.widget.GuidedAction) parameter #0:
-    Missing nullability on parameter `action` in method `onGuidedActionClicked`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onGuidedActionEditCanceled(androidx.leanback.widget.GuidedAction) parameter #0:
-    Missing nullability on parameter `action` in method `onGuidedActionEditCanceled`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onGuidedActionEditedAndProceed(androidx.leanback.widget.GuidedAction) parameter #0:
-    Missing nullability on parameter `action` in method `onGuidedActionEditedAndProceed`
 MissingNullability: androidx.leanback.app.GuidedStepFragment#onSaveInstanceState(android.os.Bundle) parameter #0:
     Missing nullability on parameter `outState` in method `onSaveInstanceState`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#onSubGuidedActionClicked(androidx.leanback.widget.GuidedAction) parameter #0:
-    Missing nullability on parameter `action` in method `onSubGuidedActionClicked`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#openInEditMode(androidx.leanback.widget.GuidedAction) parameter #0:
-    Missing nullability on parameter `action` in method `openInEditMode`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#popBackStackToGuidedStepFragment(Class<?>, int) parameter #0:
-    Missing nullability on parameter `guidedStepFragmentClass` in method `popBackStackToGuidedStepFragment`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#setActions(java.util.List<androidx.leanback.widget.GuidedAction>) parameter #0:
-    Missing nullability on parameter `actions` in method `setActions`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#setActionsDiffCallback(androidx.leanback.widget.DiffCallback<androidx.leanback.widget.GuidedAction>) parameter #0:
-    Missing nullability on parameter `diffCallback` in method `setActionsDiffCallback`
-MissingNullability: androidx.leanback.app.GuidedStepFragment#setButtonActions(java.util.List<androidx.leanback.widget.GuidedAction>) parameter #0:
-    Missing nullability on parameter `actions` in method `setButtonActions`
 MissingNullability: androidx.leanback.app.HeadersFragment#setOnHeaderClickedListener(androidx.leanback.app.HeadersFragment.OnHeaderClickedListener) parameter #0:
     Missing nullability on parameter `listener` in method `setOnHeaderClickedListener`
 MissingNullability: androidx.leanback.app.HeadersFragment#setOnHeaderViewSelectedListener(androidx.leanback.app.HeadersFragment.OnHeaderViewSelectedListener) parameter #0:
@@ -671,50 +495,20 @@
     Missing nullability on parameter `viewHolder` in method `onHeaderSelected`
 MissingNullability: androidx.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener#onHeaderSelected(androidx.leanback.widget.RowHeaderPresenter.ViewHolder, androidx.leanback.widget.Row) parameter #1:
     Missing nullability on parameter `row` in method `onHeaderSelected`
-MissingNullability: androidx.leanback.app.OnboardingFragment#getPageDescription(int):
-    Missing nullability on method `getPageDescription` return
-MissingNullability: androidx.leanback.app.OnboardingFragment#getPageTitle(int):
-    Missing nullability on method `getPageTitle` return
-MissingNullability: androidx.leanback.app.OnboardingFragment#getStartButtonText():
-    Missing nullability on method `getStartButtonText` return
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateBackgroundView`
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateBackgroundView`
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateContentView`
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateContentView`
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateDescriptionAnimator():
-    Missing nullability on method `onCreateDescriptionAnimator` return
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateForegroundView`
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateForegroundView`
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateTitleAnimator():
-    Missing nullability on method `onCreateTitleAnimator` return
 MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.OnboardingFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.OnboardingFragment#onSaveInstanceState(android.os.Bundle) parameter #0:
     Missing nullability on parameter `outState` in method `onSaveInstanceState`
-MissingNullability: androidx.leanback.app.OnboardingFragment#setStartButtonText(CharSequence) parameter #0:
-    Missing nullability on parameter `text` in method `setStartButtonText`
 MissingNullability: androidx.leanback.app.PlaybackFragment#getAdapter():
     Missing nullability on method `getAdapter` return
 MissingNullability: androidx.leanback.app.PlaybackFragment#getProgressBarManager():
     Missing nullability on method `getProgressBarManager` return
 MissingNullability: androidx.leanback.app.PlaybackFragment#onCreate(android.os.Bundle) parameter #0:
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.leanback.app.PlaybackFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
 MissingNullability: androidx.leanback.app.PlaybackFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.PlaybackFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.PlaybackFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.PlaybackFragment#onError(int, CharSequence) parameter #1:
@@ -759,14 +553,6 @@
     Missing nullability on method `getProgressBarManager` return
 MissingNullability: androidx.leanback.app.PlaybackSupportFragment#onCreate(android.os.Bundle) parameter #0:
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.leanback.app.PlaybackSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
-MissingNullability: androidx.leanback.app.PlaybackSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.PlaybackSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
-MissingNullability: androidx.leanback.app.PlaybackSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.PlaybackSupportFragment#onError(int, CharSequence) parameter #1:
     Missing nullability on parameter `errorMessage` in method `onError`
 MissingNullability: androidx.leanback.app.PlaybackSupportFragment#setAdapter(androidx.leanback.widget.ObjectAdapter) parameter #0:
@@ -911,12 +697,8 @@
     Missing nullability on parameter `query` in method `newInstance`
 MissingNullability: androidx.leanback.app.SearchFragment#onCreate(android.os.Bundle) parameter #0:
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.leanback.app.SearchFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
 MissingNullability: androidx.leanback.app.SearchFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.SearchFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.SearchFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.SearchFragment#onRequestPermissionsResult(int, String[], int[]) parameter #1:
@@ -979,14 +761,6 @@
     Missing nullability on parameter `query` in method `newInstance`
 MissingNullability: androidx.leanback.app.SearchSupportFragment#onCreate(android.os.Bundle) parameter #0:
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.leanback.app.SearchSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
-MissingNullability: androidx.leanback.app.SearchSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.SearchSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
-MissingNullability: androidx.leanback.app.SearchSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.SearchSupportFragment#onRequestPermissionsResult(int, String[], int[]) parameter #1:
     Missing nullability on parameter `permissions` in method `onRequestPermissionsResult`
 MissingNullability: androidx.leanback.app.SearchSupportFragment#onRequestPermissionsResult(int, String[], int[]) parameter #2:
@@ -1015,40 +789,14 @@
     Missing nullability on parameter `newQuery` in method `onQueryTextChange`
 MissingNullability: androidx.leanback.app.SearchSupportFragment.SearchResultProvider#onQueryTextSubmit(String) parameter #0:
     Missing nullability on parameter `query` in method `onQueryTextSubmit`
-MissingNullability: androidx.leanback.app.VerticalGridFragment#createEntranceTransition():
-    Missing nullability on method `createEntranceTransition` return
-MissingNullability: androidx.leanback.app.VerticalGridFragment#getAdapter():
-    Missing nullability on method `getAdapter` return
-MissingNullability: androidx.leanback.app.VerticalGridFragment#getGridPresenter():
-    Missing nullability on method `getGridPresenter` return
-MissingNullability: androidx.leanback.app.VerticalGridFragment#getOnItemViewClickedListener():
-    Missing nullability on method `getOnItemViewClickedListener` return
-MissingNullability: androidx.leanback.app.VerticalGridFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
 MissingNullability: androidx.leanback.app.VerticalGridFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.VerticalGridFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.VerticalGridFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
-MissingNullability: androidx.leanback.app.VerticalGridFragment#runEntranceTransition(Object) parameter #0:
-    Missing nullability on parameter `entranceTransition` in method `runEntranceTransition`
-MissingNullability: androidx.leanback.app.VerticalGridFragment#setAdapter(androidx.leanback.widget.ObjectAdapter) parameter #0:
-    Missing nullability on parameter `adapter` in method `setAdapter`
-MissingNullability: androidx.leanback.app.VerticalGridFragment#setGridPresenter(androidx.leanback.widget.VerticalGridPresenter) parameter #0:
-    Missing nullability on parameter `gridPresenter` in method `setGridPresenter`
-MissingNullability: androidx.leanback.app.VerticalGridFragment#setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener) parameter #0:
-    Missing nullability on parameter `listener` in method `setOnItemViewClickedListener`
-MissingNullability: androidx.leanback.app.VerticalGridFragment#setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener) parameter #0:
-    Missing nullability on parameter `listener` in method `setOnItemViewSelectedListener`
 MissingNullability: androidx.leanback.app.VideoFragment#getSurfaceView():
     Missing nullability on method `getSurfaceView` return
-MissingNullability: androidx.leanback.app.VideoFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
 MissingNullability: androidx.leanback.app.VideoFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
     Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.VideoFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
 MissingNullability: androidx.leanback.app.VideoFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
     Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.VideoFragment#setSurfaceHolderCallback(android.view.SurfaceHolder.Callback) parameter #0:
@@ -1059,14 +807,6 @@
     Missing nullability on parameter `callback` in method `setSurfaceHolderCallback`
 MissingNullability: androidx.leanback.app.VideoSupportFragment#getSurfaceView():
     Missing nullability on method `getSurfaceView` return
-MissingNullability: androidx.leanback.app.VideoSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
-MissingNullability: androidx.leanback.app.VideoSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.leanback.app.VideoSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
-MissingNullability: androidx.leanback.app.VideoSupportFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateView`
 MissingNullability: androidx.leanback.app.VideoSupportFragment#setSurfaceHolderCallback(android.view.SurfaceHolder.Callback) parameter #0:
     Missing nullability on parameter `callback` in method `setSurfaceHolderCallback`
 MissingNullability: androidx.leanback.app.VideoSupportFragmentGlueHost#VideoSupportFragmentGlueHost(androidx.leanback.app.VideoSupportFragment) parameter #0:
@@ -1133,8 +873,6 @@
     Missing nullability on field `TOP_FRACTION` in class `class androidx.leanback.graphics.CompositeDrawable.ChildDrawable`
 MissingNullability: androidx.leanback.graphics.FitWidthBitmapDrawable#PROPERTY_VERTICAL_OFFSET:
     Missing nullability on field `PROPERTY_VERTICAL_OFFSET` in class `class androidx.leanback.graphics.FitWidthBitmapDrawable`
-MissingNullability: androidx.leanback.graphics.FitWidthBitmapDrawable#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.leanback.graphics.FitWidthBitmapDrawable#getBitmap():
     Missing nullability on method `getBitmap` return
 MissingNullability: androidx.leanback.graphics.FitWidthBitmapDrawable#getConstantState():
@@ -2189,8 +1927,6 @@
     Missing nullability on parameter `context` in method `ShadowOverlayContainer`
 MissingNullability: androidx.leanback.widget.ShadowOverlayContainer#ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int) parameter #1:
     Missing nullability on parameter `attrs` in method `ShadowOverlayContainer`
-MissingNullability: androidx.leanback.widget.ShadowOverlayContainer#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.leanback.widget.ShadowOverlayContainer#getWrappedView():
     Missing nullability on method `getWrappedView` return
 MissingNullability: androidx.leanback.widget.ShadowOverlayContainer#prepareParentForShadow(android.view.ViewGroup) parameter #0:
@@ -2361,6 +2097,14 @@
     Bare field iconColor must be marked final, or moved behind accessors if mutable
 
 
+NotCloseable: androidx.leanback.app.BackgroundManager:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class androidx.leanback.app.BackgroundManager
+NotCloseable: androidx.leanback.media.MediaPlayerAdapter:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class androidx.leanback.media.MediaPlayerAdapter
+NotCloseable: androidx.leanback.widget.CursorObjectAdapter:
+    Classes that release resources (close()) should implement AutoCloseable and CloseGuard: class androidx.leanback.widget.CursorObjectAdapter
+
+
 RegistrationName: androidx.leanback.media.PlaybackGlue#addPlayerCallback(androidx.leanback.media.PlaybackGlue.PlayerCallback):
     Callback methods should be named register/unregister; was addPlayerCallback
 RegistrationName: androidx.leanback.media.PlaybackGlue#removePlayerCallback(androidx.leanback.media.PlaybackGlue.PlayerCallback):
diff --git a/leanback/leanback/build.gradle b/leanback/leanback/build.gradle
index 018ffd4..222547c 100644
--- a/leanback/leanback/build.gradle
+++ b/leanback/leanback/build.gradle
@@ -39,10 +39,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 17
-    }
-
     sourceSets {
         main.java.srcDirs += [
                 "common",
diff --git a/leanback/leanback/lint-baseline.xml b/leanback/leanback/lint-baseline.xml
index d5e9e66..233e326 100644
--- a/leanback/leanback/lint-baseline.xml
+++ b/leanback/leanback/lint-baseline.xml
@@ -1,23 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 18 (current min is 17): `android.view.ViewGroup#setLayoutMode`"
-        errorLine1="            mGridView.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);"
-        errorLine2="                      ~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/leanback/widget/GridActivity.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 18 (current min is 17): `android.view.ViewGroup#setLayoutMode`"
-        errorLine1="                viewGroup.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);"
-        errorLine2="                          ~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/leanback/widget/GridActivity.java"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -1344,24 +1326,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.leanback.widget.BackgroundHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                drawable.setAlpha(view.getBackground().getAlpha());"
-        errorLine2="                                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/BackgroundHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.leanback.widget.picker.DatePicker is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            yearPattern = android.text.format.DateFormat.getBestDateTimePattern(mConstant.locale,"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/picker/DatePicker.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.leanback.widget.ForegroundHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return view.getForeground();"
         errorLine2="                        ~~~~~~~~~~~~~">
@@ -1461,42 +1425,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.LeanbackTransitionHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        slide.setInterpolator(AnimationUtils.loadInterpolator(context,"
-        errorLine2="              ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.LeanbackTransitionHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        slide.addTarget(R.id.browse_title_group);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.LeanbackTransitionHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        slide.setInterpolator(AnimationUtils.loadInterpolator(context,"
-        errorLine2="              ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.LeanbackTransitionHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        slide.addTarget(R.id.browse_title_group);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.leanback.app.PermissionHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            fragment.requestPermissions(permissions, requestCode);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~">
@@ -1514,42 +1442,6 @@
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.leanback.system.Settings is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mOutlineClippingDisabled = activityManager.isLowRamDevice();"
-        errorLine2="                                                       ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/system/Settings.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.leanback.widget.StaticShadowHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            parent.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);"
-        errorLine2="                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/StaticShadowHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.leanback.widget.StaticShadowHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            shadowContainer.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);"
-        errorLine2="                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/StaticShadowHelper.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 18; however, the containing class androidx.leanback.widget.picker.TimePicker is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            hourPattern = DateFormat.getBestDateTimePattern(mConstant.locale, mIs24hFormat ? &quot;Hma&quot;"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/picker/TimePicker.java"/>
-    </issue>
-
-    <issue
         id="PrivateConstructorForUtilityClass"
         message="Utility class is missing private constructor"
         errorLine1="public class FocusHighlightHelper {"
@@ -1559,6 +1451,333 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/BackgroundHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    int alpha = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/BackgroundManager.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="kitkat/androidx/leanback/transition/CustomChangeBounds.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19 || Build.VERSION.SDK_INT >= 21) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19 || Build.VERSION.SDK_INT >= 21) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/picker/PickerUtility.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="kitkat/androidx/leanback/transition/Scale.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="kitkat/androidx/leanback/transition/SlideKitkat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v19`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `transition`.">
+        <location
+            file="src/main/res/transition-v19"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v18`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
+        <location
+            file="src/main/res/values-v18"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v19`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
+        <location
+            file="src/main/res/values-v19"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="This method should be called `getHasMediaRowSeparator` such that `hasMediaRowSeparator` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public boolean hasMediaRowSeparator() {"
diff --git a/libraryversions.toml b/libraryversions.toml
index 1f82d4b..d650674 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -12,7 +12,7 @@
 BENCHMARK = "1.3.0-alpha01"
 BIOMETRIC = "1.2.0-alpha06"
 BLUETOOTH = "1.0.0-alpha01"
-BROWSER = "1.7.0-beta01"
+BROWSER = "1.7.0-rc01"
 BUILDSRC_TESTS = "1.0.0-alpha01"
 CAMERA = "1.4.0-alpha02"
 CAMERA_PIPE = "1.0.0-alpha01"
@@ -21,7 +21,7 @@
 COLLECTION = "1.4.0-alpha02"
 COMPOSE = "1.6.0-alpha08"
 COMPOSE_COMPILER = "1.5.3"
-COMPOSE_MATERIAL3 = "1.2.0-alpha10"
+COMPOSE_MATERIAL3 = "1.2.0-alpha11"
 COMPOSE_MATERIAL3_ADAPTIVE = "1.0.0-alpha01"
 COMPOSE_RUNTIME_TRACING = "1.0.0-alpha05"
 CONSTRAINTLAYOUT = "2.2.0-alpha13"
@@ -43,7 +43,7 @@
 CORE_SPLASHSCREEN = "1.1.0-alpha02"
 CORE_TELECOM = "1.0.0-alpha02"
 CORE_UWB = "1.0.0-alpha08"
-CREDENTIALS = "1.2.0-rc01"
+CREDENTIALS = "1.2.0"
 CREDENTIALS_FIDO_QUARANTINE = "1.0.0-alpha01"
 CURSORADAPTER = "1.1.0-alpha01"
 CUSTOMVIEW = "1.2.0-alpha03"
diff --git a/lifecycle/lifecycle-common/api/api_lint.ignore b/lifecycle/lifecycle-common/api/api_lint.ignore
index e00af892..b22f657 100644
--- a/lifecycle/lifecycle-common/api/api_lint.ignore
+++ b/lifecycle/lifecycle-common/api/api_lint.ignore
@@ -5,17 +5,3 @@
     Class should be named LifecycleEventCallback
 CallbackName: androidx.lifecycle.LifecycleObserver:
     Class should be named LifecycleCallback
-
-
-InvalidNullabilityOverride: androidx.lifecycle.DefaultLifecycleObserver#onCreate(androidx.lifecycle.LifecycleOwner) parameter #0:
-    Invalid nullability on parameter `owner` in method `onCreate`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.lifecycle.DefaultLifecycleObserver#onDestroy(androidx.lifecycle.LifecycleOwner) parameter #0:
-    Invalid nullability on parameter `owner` in method `onDestroy`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.lifecycle.DefaultLifecycleObserver#onPause(androidx.lifecycle.LifecycleOwner) parameter #0:
-    Invalid nullability on parameter `owner` in method `onPause`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.lifecycle.DefaultLifecycleObserver#onResume(androidx.lifecycle.LifecycleOwner) parameter #0:
-    Invalid nullability on parameter `owner` in method `onResume`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.lifecycle.DefaultLifecycleObserver#onStart(androidx.lifecycle.LifecycleOwner) parameter #0:
-    Invalid nullability on parameter `owner` in method `onStart`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.lifecycle.DefaultLifecycleObserver#onStop(androidx.lifecycle.LifecycleOwner) parameter #0:
-    Invalid nullability on parameter `owner` in method `onStop`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
diff --git a/lifecycle/lifecycle-livedata-ktx/api/api_lint.ignore b/lifecycle/lifecycle-livedata-ktx/api/api_lint.ignore
deleted file mode 100644
index eeddf93..0000000
--- a/lifecycle/lifecycle-livedata-ktx/api/api_lint.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-KotlinDefaultParameterOrder: androidx.lifecycle.CoroutineLiveDataKt#liveData(kotlin.coroutines.CoroutineContext, java.time.Duration, kotlin.jvm.functions.Function2<? super androidx.lifecycle.LiveDataScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?>) parameter #0:
-    Parameter `context` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
-KotlinDefaultParameterOrder: androidx.lifecycle.FlowLiveDataConversions#asLiveData(kotlinx.coroutines.flow.Flow<? extends T>, kotlin.coroutines.CoroutineContext, java.time.Duration) parameter #1:
-    Parameter `context` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
diff --git a/lint-checks/integration-tests/lint-baseline.xml b/lint-checks/integration-tests/lint-baseline.xml
index c8f66aa..0377685 100644
--- a/lint-checks/integration-tests/lint-baseline.xml
+++ b/lint-checks/integration-tests/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.1.0-alpha11" type="baseline" client="gradle" dependencies="false" name="AGP (8.1.0-alpha11)" variant="all" version="8.1.0-alpha11">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="MissingClass"
@@ -12,7 +12,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 23 (current min is 14): `android.view.View#getAccessibilityClassName`"
+        message="Call requires API level 23 (current min is 19): `android.view.View#getAccessibilityClassName`"
         errorLine1="        return view.getAccessibilityClassName();"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -20,51 +20,6 @@
     </issue>
 
     <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 16): `java.lang.Character#isSurrogate`"
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `java.lang.Character#isSurrogate`"
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 16): `java.lang.Character#isSurrogate`"
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 16): `java.lang.Character#isSurrogate`"
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 16): `java.lang.Character#isSurrogate`"
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
         id="BanKeepAnnotation"
         message="Uses @Keep annotation"
         errorLine1="@Keep"
@@ -273,15 +228,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.AutofixUnsafeCallWithImplicitParamCast is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        style.setBuilder(builder);"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/AutofixUnsafeCallWithImplicitParamCast.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 20; however, the containing class androidx.AutofixUnsafeCallWithImplicitParamCast is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        builder.extend(extender);"
         errorLine2="                ~~~~~~">
@@ -363,15 +309,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.AutofixUnsafeMethodWithQualifiedClass is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return builder.setMediaSize(mediaSize);"
-        errorLine2="                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/AutofixUnsafeMethodWithQualifiedClass.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.AutofixUnsafeReferenceWithExistingClassJava is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            view.setBackgroundTintList(new ColorStateList(null, null));"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
@@ -399,15 +336,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.AutofixUnsafeStaticMethodReferenceJava is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return View.generateViewId();"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/AutofixUnsafeStaticMethodReferenceJava.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.AutofixUnsafeVoidMethodReferenceJava is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            view.setBackgroundTintList(new ColorStateList(null, null));"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
@@ -426,15 +354,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.ClassVerificationFailureFromJava is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return View.generateViewId();"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/ClassVerificationFailureFromJava.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.ClassVerificationFailureFromJava is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return view.getAccessibilityClassName();"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -443,78 +362,6 @@
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.sample.core.widget.ListViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            listView.scrollListBy(y);"
-        errorLine2="                     ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sample/core/widget/ListViewCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.sample.core.widget.ListViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return listView.canScrollList(direction);"
-        errorLine2="                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sample/core/widget/ListViewCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.sample.core.widget.ListViewCompatKotlin is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            listView.scrollListBy(y)"
-        errorLine2="                     ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sample/core/widget/ListViewCompatKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.sample.core.widget.ListViewCompatKotlin is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            listView.canScrollList(direction)"
-        errorLine2="                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sample/core/widget/ListViewCompatKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.RequiresApiKotlinNoAnnotationFails.MyStaticClass is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.RequiresApiKotlinOuter16Fails.MyStaticClass is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.RequiresApiKotlinInner16Fails.MyStaticClass is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.RequiresApiKotlinInner16Outer16Fails.MyStaticClass is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            Character.isSurrogate(c)"
-        errorLine2="                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
-    </issue>
-
-    <issue
         id="ImplicitCastClassVerificationFailure"
         message="This expression has type android.app.Notification.CarExtender (introduced in API level 23) but it used as type android.app.Notification.Extender (introduced in API level 20). Run-time class verification will not be able to validate this implicit cast on devices between these API levels."
         errorLine1="        builder.extend(extender);"
@@ -768,6 +615,105 @@
 
     <issue
         id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/AutofixUnsafeMethodWithQualifiedClass.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/AutofixUnsafeStaticMethodReferenceJava.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/ClassVerificationFailureFromJava.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sample/core/widget/ListViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sample/core/widget/ListViewCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sample/core/widget/ListViewCompatKotlin.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        return if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sample/core/widget/ListViewCompatKotlin.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/RequiresApiJava.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="     @RequiresApi(19)"
+        errorLine2="     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
         message="Unnecessary; SDK_INT is always >= 19 from outer annotation (`@RequiresApi(19)`)"
         errorLine1="    @RequiresApi(16)"
         errorLine2="    ~~~~~~~~~~~~~~~~">
@@ -776,6 +722,42 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/RequiresApiKotlin.kt"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public void callVarArgsMethodNoArgs(BaseAdapter adapter) {"
diff --git a/lint-checks/lint-baseline.xml b/lint-checks/lint-baseline.xml
deleted file mode 100644
index 5f67248..0000000
--- a/lint-checks/lint-baseline.xml
+++ /dev/null
@@ -1,2425 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.1.0-alpha11" type="baseline" client="gradle" dependencies="false" name="AGP (8.1.0-alpha11)" variant="all" version="8.1.0-alpha11">
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlAnnotationElement.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlAnnotationElement.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlAnnotationElement.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlAnnotationElementImpl(@NotNull ASTNode node) {"
-        errorLine2="                                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlAnnotationElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlAnnotationElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlAnnotationElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlAnnotationElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlAnnotationElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlAnnotationElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlBody.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlBody.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlBody.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlBody.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlBody.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlBodyImpl(@NotNull ASTNode node) {"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlBodyImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlBodyImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlBodyImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlBodyImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlBodyImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlBodyImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlBodyImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlBodyImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlConstantDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlConstantDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlConstantDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlConstantDeclarationImpl(@NotNull ASTNode node) {"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlConstantDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlConstantDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlConstantDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlConstantDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlConstantDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlConstantDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlDottedName.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlDottedName.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlDottedName.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlDottedNameImpl(@NotNull ASTNode node) {"
-        errorLine2="                            ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlDottedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlDottedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlDottedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlDottedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlDottedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlDottedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlElementType(@NotNull @NonNls String debugName) {"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlElementType.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlEnumDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlEnumDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlEnumDeclarationImpl(@NotNull ASTNode node) {"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlEnumeratorDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlEnumeratorDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlEnumeratorDeclarationImpl(@NotNull ASTNode node) {"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumeratorDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumeratorDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumeratorDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumeratorDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlEnumeratorDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlExpression.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlExpression.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlExpression.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlExpression.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlExpression.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlExpression.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlExpressionImpl(@NotNull ASTNode node) {"
-        errorLine2="                            ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlExpressionImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlFile.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlFile.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlFileType.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlFileType.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlFileType.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlFileType.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlImport.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlImport.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlImportImpl(@NotNull ASTNode node) {"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlImportImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlImportImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlImportImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlImportImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlImportImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlInterfaceDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlInterfaceDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlInterfaceDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlInterfaceDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlInterfaceDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlInterfaceDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlInterfaceDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlInterfaceDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlInterfaceDeclarationImpl(@NotNull ASTNode node) {"
-        errorLine2="                                      ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlInterfaceDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlMethodDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlMethodDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlMethodDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlMethodDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlMethodDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlMethodDeclarationImpl(@NotNull ASTNode node) {"
-        errorLine2="                                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlMethodDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlMethodDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlMethodDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlMethodDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlMethodDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlMethodDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlMethodDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlMethodDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlNameComponent.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlNameComponentImpl(@NotNull ASTNode node) {"
-        errorLine2="                               ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNameComponentImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNameComponentImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNameComponentImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNameComponentImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlNamedElementImpl(@NotNull ASTNode node) {"
-        errorLine2="                              ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNamedElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNamedElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {"
-        errorLine2="                                    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNamedElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNamedElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlNamedElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlPackage.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlPackageImpl(@NotNull ASTNode node) {"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlPackageImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlPackageImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlPackageImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlPackageImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParameter.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParameter.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlParameterImpl(@NotNull ASTNode node) {"
-        errorLine2="                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParameterImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParameterImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParameterImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParameterImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParameterImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlParcelableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlParcelableDeclarationImpl(@NotNull ASTNode node) {"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlParcelableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/AidlParserDefinition.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlPsiCompositeElementImpl(@NotNull ASTNode node) {"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlPsiCompositeElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlQualifiedName.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlQualifiedName.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlQualifiedName.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlQualifiedName.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlQualifiedName.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlQualifiedNameImpl(@NotNull ASTNode node) {"
-        errorLine2="                               ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlQualifiedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlQualifiedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlQualifiedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlQualifiedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlQualifiedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlQualifiedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlQualifiedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlQualifiedNameImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlTokenType(@NotNull @NonNls String debugName) {"
-        errorLine2="                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/lexer/AidlTokenType.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlTypeElement.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlTypeElement.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlTypeElement.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlTypeElementImpl(@NotNull ASTNode node) {"
-        errorLine2="                             ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlTypeElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlTypeElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlTypeElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlTypeElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlTypeElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlTypeElementImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlUnionDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlUnionDeclarationImpl(@NotNull ASTNode node) {"
-        errorLine2="                                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlUnionDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVariableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVariableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVariableDeclaration.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public AidlVariableDeclarationImpl(@NotNull ASTNode node) {"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlVariableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull AidlVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlVariableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void accept(@NotNull PsiElementVisitor visitor) {"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlVariableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="  @Nullable"
-        errorLine2="  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlVariableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlVariableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  @NotNull"
-        errorLine2="  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/impl/AidlVariableDeclarationImpl.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitAnnotationElement(@NotNull AidlAnnotationElement o) {"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitBody(@NotNull AidlBody o) {"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitConstantDeclaration(@NotNull AidlConstantDeclaration o) {"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitDottedName(@NotNull AidlDottedName o) {"
-        errorLine2="                              ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitEnumDeclaration(@NotNull AidlEnumDeclaration o) {"
-        errorLine2="                                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitEnumeratorDeclaration(@NotNull AidlEnumeratorDeclaration o) {"
-        errorLine2="                                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitExpression(@NotNull AidlExpression o) {"
-        errorLine2="                              ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitImport(@NotNull AidlImport o) {"
-        errorLine2="                          ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitInterfaceDeclaration(@NotNull AidlInterfaceDeclaration o) {"
-        errorLine2="                                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitMethodDeclaration(@NotNull AidlMethodDeclaration o) {"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitNameComponent(@NotNull AidlNameComponent o) {"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitPackage(@NotNull AidlPackage o) {"
-        errorLine2="                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitParameter(@NotNull AidlParameter o) {"
-        errorLine2="                             ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitParcelableDeclaration(@NotNull AidlParcelableDeclaration o) {"
-        errorLine2="                                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitQualifiedName(@NotNull AidlQualifiedName o) {"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitTypeElement(@NotNull AidlTypeElement o) {"
-        errorLine2="                               ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitUnionDeclaration(@NotNull AidlUnionDeclaration o) {"
-        errorLine2="                                    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitVariableDeclaration(@NotNull AidlVariableDeclaration o) {"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitDeclaration(@NotNull AidlDeclaration o) {"
-        errorLine2="                               ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitNamedElement(@NotNull AidlNamedElement o) {"
-        errorLine2="                                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="  public void visitPsiCompositeElement(@NotNull AidlPsiCompositeElement o) {"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/psi/AidlVisitor.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="    @NotNull"
-        errorLine2="    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/analysis/AnalysisBundle.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="    public static @Nls String message(@NotNull @PropertyKey(resourceBundle = BUNDLE) String key,"
-        errorLine2="                                      ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/analysis/AnalysisBundle.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="            @NotNull Object... params) {"
-        errorLine2="            ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/analysis/AnalysisBundle.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="    public static boolean isWhitespaceOrComment(@NotNull PsiBuilder builder, @Nullable IElementType type) {"
-        errorLine2="                                                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="    public static boolean isWhitespaceOrComment(@NotNull PsiBuilder builder, @Nullable IElementType type) {"
-        errorLine2="                                                                             ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="    private static boolean wasAutoSkipped(@NotNull PsiBuilder builder, int steps) {"
-        errorLine2="                                          ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="            @Nullable IElementType elementType,"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="            @Nullable Parser eatMore) {"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="            @Nullable IElementType elementType,"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="            @Nullable Parser eatMore) {"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="    private static void run_hooks_impl_(PsiBuilder builder, ErrorState state, @Nullable IElementType elementType) {"
-        errorLine2="                                                                              ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="            @Nullable IElementType elementType,"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="            @Nullable Parser eatMore) {"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.Nullable` instead of `@org.jetbrains.annotations.Nullable`"
-        errorLine1="    @Nullable"
-        errorLine2="    ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="    private static PsiBuilderImpl.ProductionMarker getLatestExtensibleDoneMarker(@NotNull PsiBuilder builder) {"
-        errorLine2="                                                                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="        @NotNull"
-        errorLine2="        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="        @NotNull"
-        errorLine2="        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="        public @NotNull String getExpected(int position, boolean expected) {"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="        @NotNull"
-        errorLine2="        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="NullabilityAnnotationsDetector"
-        message="Use `@androidx.annotation.NonNull` instead of `@org.jetbrains.annotations.NotNull`"
-        errorLine1="        @NotNull"
-        errorLine2="        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-    <issue
-        id="PrivateConstructorForUtilityClass"
-        message="Utility class is missing private constructor"
-        errorLine1="  class Factory {"
-        errorLine2="        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/android/tools/idea/lang/aidl/lexer/AidlTokenTypes.java"/>
-    </issue>
-
-    <issue
-        id="PrivateConstructorForUtilityClass"
-        message="Utility class is missing private constructor"
-        errorLine1="public class GeneratedParserUtilBase {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/com/intellij/lang/parser/GeneratedParserUtilBase.java"/>
-    </issue>
-
-</issues>
diff --git a/media/media/api/api_lint.ignore b/media/media/api/api_lint.ignore
index 2a61822..fba27a9 100644
--- a/media/media/api/api_lint.ignore
+++ b/media/media/api/api_lint.ignore
@@ -661,6 +661,14 @@
     Bare field volumeType must be marked final, or moved behind accessors if mutable
 
 
+NotCloseable: android.support.v4.media.MediaBrowserCompat:
+    Classes that release resources (disconnect()) should implement AutoCloseable and CloseGuard: class android.support.v4.media.MediaBrowserCompat
+NotCloseable: android.support.v4.media.session.MediaControllerCompat.TransportControls:
+    Classes that release resources (stop()) should implement AutoCloseable and CloseGuard: class android.support.v4.media.session.MediaControllerCompat.TransportControls
+NotCloseable: android.support.v4.media.session.MediaSessionCompat:
+    Classes that release resources (release()) should implement AutoCloseable and CloseGuard: class android.support.v4.media.session.MediaSessionCompat
+
+
 NullableCollection: android.support.v4.media.MediaBrowserCompat#getExtras():
     Return type of method android.support.v4.media.MediaBrowserCompat.getExtras() is a nullable collection (`android.os.Bundle`); must be non-null
 NullableCollection: android.support.v4.media.MediaDescriptionCompat#getExtras():
diff --git a/media/media/api/restricted_1.7.0-beta01.txt b/media/media/api/restricted_1.7.0-beta01.txt
index 4f0864c..fa7d4db 100644
--- a/media/media/api/restricted_1.7.0-beta01.txt
+++ b/media/media/api/restricted_1.7.0-beta01.txt
@@ -650,6 +650,8 @@
     method public void onLoadChildren(String, androidx.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem!>!>, android.os.Bundle);
     method public void onLoadItem(String!, androidx.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem!>);
     method public void onSearch(String, android.os.Bundle!, androidx.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onSubscribe(String!, android.os.Bundle!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onUnsubscribe(String!);
     method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token!);
     field public static final String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
   }
diff --git a/media/media/api/restricted_current.txt b/media/media/api/restricted_current.txt
index 4f0864c..fa7d4db 100644
--- a/media/media/api/restricted_current.txt
+++ b/media/media/api/restricted_current.txt
@@ -650,6 +650,8 @@
     method public void onLoadChildren(String, androidx.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem!>!>, android.os.Bundle);
     method public void onLoadItem(String!, androidx.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem!>);
     method public void onSearch(String, android.os.Bundle!, androidx.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem!>!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onSubscribe(String!, android.os.Bundle!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onUnsubscribe(String!);
     method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token!);
     field public static final String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
   }
diff --git a/media/media/lint-baseline.xml b/media/media/lint-baseline.xml
index 80dd31ec..8f842ee 100644
--- a/media/media/lint-baseline.xml
+++ b/media/media/lint-baseline.xml
@@ -1,94 +1,121 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="oneway interface IMediaControllerCallback {"
-        errorLine2="^">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.KITKAT"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl"/>
+            file="src/main/java/androidx/media/AudioFocusRequestCompat.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="interface IMediaSession {"
-        errorLine2="^">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/session/IMediaSession.aidl"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="@JavaOnlyStableParcelable parcelable MediaDescriptionCompat;"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="@JavaOnlyStableParcelable parcelable MediaMetadataCompat;"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="@JavaOnlyStableParcelable parcelable MediaSessionCompat.Token;"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (android.os.Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="@JavaOnlyStableParcelable parcelable MediaSessionCompat.QueueItem;"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (android.os.Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="@JavaOnlyStableParcelable parcelable MediaSessionCompat.ResultReceiverWrapper;"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="@JavaOnlyStableParcelable parcelable ParcelableVolumeInfo;"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="@JavaOnlyStableParcelable parcelable PlaybackStateCompat;"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 15) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="@JavaOnlyStableParcelable parcelable RatingCompat;"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 15"
+        errorLine1="    @RequiresApi(15)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/android/support/v4/media/RatingCompat.aidl"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (ratingObj != null &amp;&amp; Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (mRatingObj == null &amp;&amp; Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
diff --git a/media/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java b/media/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
index c01a837..db98259 100644
--- a/media/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
+++ b/media/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
@@ -402,8 +402,20 @@
                     new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
                         @Override
                         void onResultSent(@Nullable List<MediaBrowserCompat.MediaItem> list) {
-                            List<Parcel> parcelList = null;
-                            if (list != null) {
+                            List<Parcel> parcelList;
+                            if (list == null) {
+                                // A null children list here indicates that the requested parentId
+                                // is invalid. Unfortunately before API 24 the platform
+                                // MediaBrowserService's implementation of Result inside
+                                // performLoadChildren (invoked below) throws an exception if
+                                // given a null list  (b/19127753). This means there's no clear
+                                // way to communicate an invalid parentId, so in order to avoid
+                                // an exception below API 24 we transform null to an empty list
+                                // here (meaning it looks like parentId is valid but has no
+                                // children).
+                                parcelList = Build.VERSION.SDK_INT >= 24
+                                        ? null : Collections.emptyList();
+                            } else {
                                 parcelList = new ArrayList<>(list.size());
                                 for (MediaBrowserCompat.MediaItem item : list) {
                                     Parcel parcel = Parcel.obtain();
@@ -1357,7 +1369,7 @@
      * @param id id
      * @param option option
      */
-    @RestrictTo(LIBRARY)
+    @RestrictTo(LIBRARY_GROUP_PREFIX)
     public void onSubscribe(String id, Bundle option) {
     }
 
@@ -1366,7 +1378,7 @@
      *
      * @param id
      */
-    @RestrictTo(LIBRARY)
+    @RestrictTo(LIBRARY_GROUP_PREFIX)
     public void onUnsubscribe(String id) {
     }
 
diff --git a/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserTest.java b/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserTest.java
index aa2a0a6..e112dd9 100644
--- a/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserTest.java
+++ b/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserTest.java
@@ -28,6 +28,7 @@
 import static android.support.mediacompat.testlib.MediaBrowserConstants.SEND_DELAYED_NOTIFY_CHILDREN_CHANGED;
 import static android.support.mediacompat.testlib.MediaBrowserConstants.SET_SESSION_TOKEN;
 import static android.support.mediacompat.testlib.VersionConstants.KEY_SERVICE_VERSION;
+import static android.support.mediacompat.testlib.VersionConstants.VERSION_TOT;
 import static android.support.mediacompat.testlib.util.IntentUtil.SERVICE_PACKAGE_NAME;
 import static android.support.mediacompat.testlib.util.IntentUtil.callMediaBrowserServiceMethod;
 
@@ -41,6 +42,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
 
 import android.content.ComponentName;
 import android.content.Context;
@@ -54,6 +56,7 @@
 import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.MediumTest;
@@ -66,9 +69,11 @@
 import org.junit.runner.RunWith;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Test connection between framework {@link MediaBrowser} and
@@ -77,7 +82,7 @@
  * TODO: Lower the minSdkVersion of this test to LOLLIPOP.
  */
 @RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 28)
+@SdkSuppress(minSdkVersion = 21)
 public class MediaBrowserTest {
 
     private static final String TAG = "MediaBrowserTest";
@@ -112,7 +117,6 @@
     private MediaBrowser mMediaBrowser;
     private StubConnectionCallback mConnectionCallback;
     private StubSubscriptionCallback mSubscriptionCallback;
-    private StubItemCallback mItemCallback;
     private Bundle mRootHints;
 
     @Before
@@ -123,7 +127,6 @@
 
         mConnectionCallback = new StubConnectionCallback();
         mSubscriptionCallback = new StubSubscriptionCallback();
-        mItemCallback = new StubItemCallback();
 
         mRootHints = new Bundle();
         mRootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true);
@@ -227,6 +230,7 @@
 
     @Test
     @MediumTest
+    @SdkSuppress(minSdkVersion = 23)
     public void testReconnection() throws Exception {
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -247,27 +251,28 @@
         mSubscriptionCallback.reset(1);
         mMediaBrowser.subscribe(MEDIA_ID_ROOT, mSubscriptionCallback);
         mSubscriptionCallback.await(TIME_OUT_MS);
-        assertEquals(1, mSubscriptionCallback.mChildrenLoadedCount);
+        assertEquals(1, mSubscriptionCallback.mChildrenLoadedCount.get());
         assertEquals(MEDIA_ID_ROOT, mSubscriptionCallback.mLastParentId);
 
-        synchronized (mItemCallback.mWaitLock) {
+        StubItemCallback itemCallback = new StubItemCallback();
+        synchronized (itemCallback.mWaitLock) {
             // Test getItem.
-            mItemCallback.reset();
-            mMediaBrowser.getItem(MEDIA_ID_CHILDREN[0], mItemCallback);
-            mItemCallback.mWaitLock.wait(TIME_OUT_MS);
-            assertEquals(MEDIA_ID_CHILDREN[0], mItemCallback.mLastMediaItem.getMediaId());
+            itemCallback.reset();
+            mMediaBrowser.getItem(MEDIA_ID_CHILDREN[0], itemCallback);
+            itemCallback.mWaitLock.wait(TIME_OUT_MS);
+            assertEquals(MEDIA_ID_CHILDREN[0], itemCallback.mLastMediaItem.getMediaId());
         }
 
         // Reconnect after connection was established.
         mMediaBrowser.disconnect();
         connectMediaBrowserService();
 
-        synchronized (mItemCallback.mWaitLock) {
+        synchronized (itemCallback.mWaitLock) {
             // Test getItem.
-            mItemCallback.reset();
-            mMediaBrowser.getItem(MEDIA_ID_CHILDREN[0], mItemCallback);
-            mItemCallback.mWaitLock.wait(TIME_OUT_MS);
-            assertEquals(MEDIA_ID_CHILDREN[0], mItemCallback.mLastMediaItem.getMediaId());
+            itemCallback.reset();
+            mMediaBrowser.getItem(MEDIA_ID_CHILDREN[0], itemCallback);
+            itemCallback.mWaitLock.wait(TIME_OUT_MS);
+            assertEquals(MEDIA_ID_CHILDREN[0], itemCallback.mLastMediaItem.getMediaId());
         }
     }
 
@@ -349,7 +354,7 @@
         mSubscriptionCallback.reset(1);
         mMediaBrowser.subscribe(MEDIA_ID_ROOT, mSubscriptionCallback);
         mSubscriptionCallback.await(TIME_OUT_MS);
-        assertEquals(1, mSubscriptionCallback.mChildrenLoadedCount);
+        assertEquals(1, mSubscriptionCallback.mChildrenLoadedCount.get());
         assertEquals(MEDIA_ID_ROOT, mSubscriptionCallback.mLastParentId);
         assertEquals(MEDIA_ID_CHILDREN.length, mSubscriptionCallback.mLastChildMediaItems.size());
         for (int i = 0; i < MEDIA_ID_CHILDREN.length; ++i) {
@@ -362,7 +367,7 @@
         callMediaBrowserServiceMethod(NOTIFY_CHILDREN_CHANGED, MEDIA_ID_ROOT,
                 getApplicationContext());
         mSubscriptionCallback.await(TIME_OUT_MS);
-        assertEquals(1, mSubscriptionCallback.mChildrenLoadedCount);
+        assertEquals(1, mSubscriptionCallback.mChildrenLoadedCount.get());
 
         // Test unsubscribe.
         mSubscriptionCallback.reset(1);
@@ -375,7 +380,7 @@
         mSubscriptionCallback.await(WAIT_TIME_FOR_NO_RESPONSE_MS);
 
         // onChildrenLoaded should not be called.
-        assertEquals(0, mSubscriptionCallback.mChildrenLoadedCount);
+        assertEquals(0, mSubscriptionCallback.mChildrenLoadedCount.get());
     }
 
     @Test
@@ -393,7 +398,7 @@
             options.putInt(MediaBrowser.EXTRA_PAGE, page);
             mMediaBrowser.subscribe(MEDIA_ID_ROOT, options, mSubscriptionCallback);
             assertTrue(mSubscriptionCallback.await(TIME_OUT_MS));
-            assertEquals(1, mSubscriptionCallback.mChildrenLoadedWithOptionCount);
+            assertEquals(1, mSubscriptionCallback.mChildrenLoadedWithOptionCount.get());
             assertEquals(MEDIA_ID_ROOT, mSubscriptionCallback.mLastParentId);
             if (page != lastPage) {
                 assertEquals(pageSize, mSubscriptionCallback.mLastChildMediaItems.size());
@@ -412,7 +417,7 @@
             callMediaBrowserServiceMethod(NOTIFY_CHILDREN_CHANGED, MEDIA_ID_ROOT,
                     getApplicationContext());
             assertTrue(mSubscriptionCallback.await(TIME_OUT_MS * (page + 1)));
-            assertEquals(page + 1, mSubscriptionCallback.mChildrenLoadedWithOptionCount);
+            assertEquals(page + 1, mSubscriptionCallback.mChildrenLoadedWithOptionCount.get());
         }
 
         // Test unsubscribe with callback argument.
@@ -429,7 +434,7 @@
             fail("Unexpected InterruptedException occurred.");
         }
         // onChildrenLoaded should not be called.
-        assertEquals(0, mSubscriptionCallback.mChildrenLoadedCount);
+        assertEquals(0, mSubscriptionCallback.mChildrenLoadedCount.get());
     }
 
     @Test
@@ -440,24 +445,37 @@
         mSubscriptionCallback.reset(1);
         mMediaBrowser.subscribe(MEDIA_ID_CHILDREN_DELAYED, mSubscriptionCallback);
         assertFalse(mSubscriptionCallback.await(WAIT_TIME_FOR_NO_RESPONSE_MS));
-        assertEquals(0, mSubscriptionCallback.mChildrenLoadedCount);
+        assertEquals(0, mSubscriptionCallback.mChildrenLoadedCount.get());
 
         callMediaBrowserServiceMethod(
                 SEND_DELAYED_NOTIFY_CHILDREN_CHANGED, MEDIA_ID_CHILDREN_DELAYED,
                 getApplicationContext());
         assertTrue(mSubscriptionCallback.await(TIME_OUT_MS));
-        assertEquals(1, mSubscriptionCallback.mChildrenLoadedCount);
+        assertEquals(1, mSubscriptionCallback.mChildrenLoadedCount.get());
     }
 
     @Test
     @SmallTest
+    @SdkSuppress(minSdkVersion = 21)
     public void testSubscribeInvalidItem() throws Exception {
+        // TODO: Remove this when the 'previous' service version contains the fix in
+        //  http://r.android.com/2794937.
+        assumeTrue(Build.VERSION.SDK_INT >= 24 || mServiceVersion.equals(VERSION_TOT));
+
         connectMediaBrowserService();
 
         mSubscriptionCallback.reset(1);
         mMediaBrowser.subscribe(MEDIA_ID_INVALID, mSubscriptionCallback);
         mSubscriptionCallback.await(TIME_OUT_MS);
-        assertEquals(MEDIA_ID_INVALID, mSubscriptionCallback.mLastErrorId);
+        if (Build.VERSION.SDK_INT < 24) {
+            // There's no way to communicate an invalid media ID on API < 24 because the documented
+            // way of emitting children = null from MediaBrowserService.onLoadChildren throws an
+            // exception from inside MediaBrowserService (b/19127753). Therefore we return an empty
+            // list of children, which is technically incorrect but avoids the exception.
+            assertEquals(Collections.emptyList(), mSubscriptionCallback.mLastChildMediaItems);
+        } else {
+            assertEquals(MEDIA_ID_INVALID, mSubscriptionCallback.mLastErrorId);
+        }
     }
 
     @Test
@@ -504,7 +522,7 @@
             callback.await(TIME_OUT_MS);
 
             // Each onChildrenLoaded() must be called.
-            assertEquals(1, callback.mChildrenLoadedWithOptionCount);
+            assertEquals(1, callback.mChildrenLoadedWithOptionCount.get());
         }
 
         // Reset callbacks and unsubscribe.
@@ -525,7 +543,7 @@
 
         // onChildrenLoaded should not be called.
         for (StubSubscriptionCallback callback : subscriptionCallbacks) {
-            assertEquals(0, callback.mChildrenLoadedWithOptionCount);
+            assertEquals(0, callback.mChildrenLoadedWithOptionCount.get());
         }
     }
 
@@ -550,7 +568,7 @@
             callback.await(TIME_OUT_MS);
 
             // Each onChildrenLoaded() must be called.
-            assertEquals(1, callback.mChildrenLoadedWithOptionCount);
+            assertEquals(1, callback.mChildrenLoadedWithOptionCount.get());
         }
 
         // Unsubscribe existing subscriptions one-by-one.
@@ -575,7 +593,7 @@
                 StubSubscriptionCallback callback = subscriptionCallbacks
                         .get(orderOfRemovingCallbacks[j]);
                 assertTrue(callback.await(TIME_OUT_MS * remaining));
-                assertEquals(1, callback.mChildrenLoadedWithOptionCount);
+                assertEquals(1, callback.mChildrenLoadedWithOptionCount.get());
             }
 
             try {
@@ -588,68 +606,78 @@
             for (int j = 0; j <= i; j++) {
                 StubSubscriptionCallback callback = subscriptionCallbacks
                         .get(orderOfRemovingCallbacks[j]);
-                assertEquals(0, callback.mChildrenLoadedWithOptionCount);
+                assertEquals(0, callback.mChildrenLoadedWithOptionCount.get());
             }
         }
     }
 
     @Test
     @SmallTest
+    @SdkSuppress(minSdkVersion = 23)
     public void testGetItem() throws Exception {
         connectMediaBrowserService();
 
-        synchronized (mItemCallback.mWaitLock) {
-            mMediaBrowser.getItem(MEDIA_ID_CHILDREN[0], mItemCallback);
-            mItemCallback.mWaitLock.wait(TIME_OUT_MS);
-            assertNotNull(mItemCallback.mLastMediaItem);
-            assertEquals(MEDIA_ID_CHILDREN[0], mItemCallback.mLastMediaItem.getMediaId());
+        StubItemCallback itemCallback = new StubItemCallback();
+        synchronized (itemCallback.mWaitLock) {
+            mMediaBrowser.getItem(MEDIA_ID_CHILDREN[0], itemCallback);
+            itemCallback.mWaitLock.wait(TIME_OUT_MS);
+            assertNotNull(itemCallback.mLastMediaItem);
+            assertEquals(MEDIA_ID_CHILDREN[0], itemCallback.mLastMediaItem.getMediaId());
         }
     }
 
     @Test
     @MediumTest
+    @SdkSuppress(minSdkVersion = 23)
     public void testGetItemDelayed() throws Exception {
         connectMediaBrowserService();
 
-        synchronized (mItemCallback.mWaitLock) {
-            mMediaBrowser.getItem(MEDIA_ID_CHILDREN_DELAYED, mItemCallback);
-            mItemCallback.mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
-            assertNull(mItemCallback.mLastMediaItem);
+        StubItemCallback itemCallback = new StubItemCallback();
+        synchronized (itemCallback.mWaitLock) {
+            mMediaBrowser.getItem(MEDIA_ID_CHILDREN_DELAYED, itemCallback);
+            itemCallback.mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
+            assertNull(itemCallback.mLastMediaItem);
 
-            mItemCallback.reset();
+            itemCallback.reset();
             callMediaBrowserServiceMethod(SEND_DELAYED_ITEM_LOADED, new Bundle(),
                     getApplicationContext());
-            mItemCallback.mWaitLock.wait(TIME_OUT_MS);
-            assertNotNull(mItemCallback.mLastMediaItem);
-            assertEquals(MEDIA_ID_CHILDREN_DELAYED, mItemCallback.mLastMediaItem.getMediaId());
+            itemCallback.mWaitLock.wait(TIME_OUT_MS);
+            assertNotNull(itemCallback.mLastMediaItem);
+            assertEquals(MEDIA_ID_CHILDREN_DELAYED, itemCallback.mLastMediaItem.getMediaId());
         }
     }
 
     @Test
     @SmallTest
+    @SdkSuppress(minSdkVersion = 23)
     public void testGetItemWhenOnLoadItemIsNotImplemented() throws Exception {
         connectMediaBrowserService();
-        synchronized (mItemCallback.mWaitLock) {
-            mMediaBrowser.getItem(MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED, mItemCallback);
-            mItemCallback.mWaitLock.wait(TIME_OUT_MS);
+        StubItemCallback itemCallback = new StubItemCallback();
+        synchronized (itemCallback.mWaitLock) {
+            mMediaBrowser.getItem(MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED, itemCallback);
+            itemCallback.mWaitLock.wait(TIME_OUT_MS);
             // Limitation: Framework media browser gets onItemLoaded() call with null media item,
             // instead of onError().
-            // assertEquals(MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED, mItemCallback.mLastErrorId);
+            // assertEquals(MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED, itemCallback.mLastErrorId);
         }
     }
 
     @Test
     @SmallTest
+    // TODO: Lower this to 23. This test fails because mLastMediaItem below is not null on API
+    //  levels 23, 24 and 25.
+    @SdkSuppress(minSdkVersion = 26)
     public void testGetItemWhenMediaIdIsInvalid() throws Exception {
-        mItemCallback.mLastMediaItem = new MediaItem(new MediaDescription.Builder()
+        StubItemCallback itemCallback = new StubItemCallback();
+        itemCallback.mLastMediaItem = new MediaItem(new MediaDescription.Builder()
                 .setMediaId("dummy_id").build(), MediaItem.FLAG_BROWSABLE);
 
         connectMediaBrowserService();
-        synchronized (mItemCallback.mWaitLock) {
-            mMediaBrowser.getItem(MEDIA_ID_INVALID, mItemCallback);
-            mItemCallback.mWaitLock.wait(TIME_OUT_MS);
-            assertNull(mItemCallback.mLastMediaItem);
-            assertNull(mItemCallback.mLastErrorId);
+        synchronized (itemCallback.mWaitLock) {
+            mMediaBrowser.getItem(MEDIA_ID_INVALID, itemCallback);
+            itemCallback.mWaitLock.wait(TIME_OUT_MS);
+            assertNull(itemCallback.mLastMediaItem);
+            assertNull(itemCallback.mLastErrorId);
         }
     }
 
@@ -696,7 +724,7 @@
         }
     }
 
-    private class StubConnectionCallback extends MediaBrowser.ConnectionCallback {
+    private static class StubConnectionCallback extends MediaBrowser.ConnectionCallback {
         final Object mWaitLock = new Object();
         volatile int mConnectedCount;
         volatile int mConnectionFailedCount;
@@ -733,10 +761,10 @@
         }
     }
 
-    private class StubSubscriptionCallback extends MediaBrowser.SubscriptionCallback {
+    private static class StubSubscriptionCallback extends MediaBrowser.SubscriptionCallback {
+        private final AtomicInteger mChildrenLoadedCount = new AtomicInteger();
+        private final AtomicInteger mChildrenLoadedWithOptionCount = new AtomicInteger();
         private volatile CountDownLatch mLatch;
-        private volatile int mChildrenLoadedCount;
-        private volatile int mChildrenLoadedWithOptionCount;
         private volatile String mLastErrorId;
         private volatile String mLastParentId;
         private volatile Bundle mLastOptions;
@@ -744,8 +772,8 @@
 
         public void reset(int count) {
             mLatch = new CountDownLatch(count);
-            mChildrenLoadedCount = 0;
-            mChildrenLoadedWithOptionCount = 0;
+            mChildrenLoadedCount.set(0);
+            mChildrenLoadedWithOptionCount.set(0);
             mLastErrorId = null;
             mLastParentId = null;
             mLastOptions = null;
@@ -763,7 +791,7 @@
 
         @Override
         public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaItem> children) {
-            mChildrenLoadedCount++;
+            mChildrenLoadedCount.incrementAndGet();
             mLastParentId = parentId;
             mLastChildMediaItems = children;
             mLatch.countDown();
@@ -772,7 +800,7 @@
         @Override
         public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaItem> children,
                 @NonNull Bundle options) {
-            mChildrenLoadedWithOptionCount++;
+            mChildrenLoadedWithOptionCount.incrementAndGet();
             mLastParentId = parentId;
             mLastOptions = options;
             mLastChildMediaItems = children;
@@ -793,7 +821,8 @@
         }
     }
 
-    private class StubItemCallback extends MediaBrowser.ItemCallback {
+    @RequiresApi(23)
+    private static class StubItemCallback extends MediaBrowser.ItemCallback {
         final Object mWaitLock = new Object();
         private volatile MediaItem mLastMediaItem;
         private volatile String mLastErrorId;
@@ -820,7 +849,8 @@
         }
     }
 
-    private class ConnectionCallbackForDelayedMediaSession extends MediaBrowser.ConnectionCallback {
+    private static class ConnectionCallbackForDelayedMediaSession
+            extends MediaBrowser.ConnectionCallback {
         final Object mWaitLock = new Object();
         private int mConnectedCount = 0;
 
diff --git a/media/version-compat-tests/lib/lint-baseline.xml b/media/version-compat-tests/lib/lint-baseline.xml
index 6ce321a..42ca34d 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="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -11,6 +11,42 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/android/support/mediacompat/testlib/util/IntentUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/android/support/mediacompat/testlib/util/IntentUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/android/support/mediacompat/testlib/util/IntentUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/android/support/mediacompat/testlib/util/IntentUtil.java"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public void writeToParcel(Parcel dest, int flags) {"
diff --git a/media2/media2-common/build.gradle b/media2/media2-common/build.gradle
index 6af878c..27f8bef 100644
--- a/media2/media2-common/build.gradle
+++ b/media2/media2-common/build.gradle
@@ -45,9 +45,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 16
-    }
     buildFeatures {
         aidl = true
     }
diff --git a/media2/media2-common/lint-baseline.xml b/media2/media2-common/lint-baseline.xml
index 37d6a19..bb07e11 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="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="RestrictedApiAndroidX"
@@ -47,6 +47,15 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="        @RequiresApi(18)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/common/ClassVerificationHelper.java"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="This method should be called `getMediaItem` such that `mediaItem` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public abstract MediaItem getCurrentMediaItem();"
diff --git a/media2/media2-player/build.gradle b/media2/media2-player/build.gradle
index 230e6d5..70a7c6f 100644
--- a/media2/media2-player/build.gradle
+++ b/media2/media2-player/build.gradle
@@ -42,9 +42,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 16
-    }
     namespace "androidx.media2.player"
 }
 
diff --git a/media2/media2-player/lint-baseline.xml b/media2/media2-player/lint-baseline.xml
index 675ab6e..98ca85a 100644
--- a/media2/media2-player/lint-baseline.xml
+++ b/media2/media2-player/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-beta03" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Call requires API level 27 (current min is 16): `android.app.Activity#setTurnScreenOn`"
+        message="Call requires API level 27 (current min is 19): `android.app.Activity#setTurnScreenOn`"
         errorLine1="                mActivity.setTurnScreenOn(true);"
         errorLine2="                          ~~~~~~~~~~~~~~~">
         <location
@@ -12,7 +12,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 27 (current min is 16): `android.app.Activity#setShowWhenLocked`"
+        message="Call requires API level 27 (current min is 19): `android.app.Activity#setShowWhenLocked`"
         errorLine1="                mActivity.setShowWhenLocked(true);"
         errorLine2="                          ~~~~~~~~~~~~~~~~~">
         <location
@@ -21,7 +21,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 16): `android.app.KeyguardManager#requestDismissKeyguard`"
+        message="Call requires API level 26 (current min is 19): `android.app.KeyguardManager#requestDismissKeyguard`"
         errorLine1="                mKeyguardManager.requestDismissKeyguard(mActivity, null);"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -30,16 +30,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 18 (current min is 16): `android.media.MediaDrm.KeyRequest#getData`"
-        errorLine1="        if (0 == getKeyIds(keyRequest.getData(), keyIds)) {"
-        errorLine2="                                      ~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/media2/player/MediaPlayer2DrmTestBase.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 27 (current min is 16): `android.app.Activity#setTurnScreenOn`"
+        message="Call requires API level 27 (current min is 19): `android.app.Activity#setTurnScreenOn`"
         errorLine1="                mActivity.setTurnScreenOn(true);"
         errorLine2="                          ~~~~~~~~~~~~~~~">
         <location
@@ -48,7 +39,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 27 (current min is 16): `android.app.Activity#setShowWhenLocked`"
+        message="Call requires API level 27 (current min is 19): `android.app.Activity#setShowWhenLocked`"
         errorLine1="                mActivity.setShowWhenLocked(true);"
         errorLine2="                          ~~~~~~~~~~~~~~~~~">
         <location
@@ -57,7 +48,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 26 (current min is 16): `android.app.KeyguardManager#requestDismissKeyguard`"
+        message="Call requires API level 26 (current min is 19): `android.app.KeyguardManager#requestDismissKeyguard`"
         errorLine1="                mKeyguardManager.requestDismissKeyguard(mActivity, null);"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -65,15 +56,6 @@
     </issue>
 
     <issue
-        id="NewApi"
-        message="Call requires API level 18 (current min is 16): `android.media.MediaDrm.KeyRequest#getData`"
-        errorLine1="        if (0 == getKeyIds(keyRequest.getData(), keyIds)) {"
-        errorLine2="                                      ~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/media2/player/MediaPlayerDrmTest.java"/>
-    </issue>
-
-    <issue
         id="WrongConstant"
         message="Must be one of: BaseResult.RESULT_SUCCESS, DrmResult.RESULT_ERROR_PROVISIONING_NETWORK_ERROR, DrmResult.RESULT_ERROR_PROVISIONING_SERVER_ERROR, DrmResult.RESULT_ERROR_PREPARATION_ERROR, DrmResult.RESULT_ERROR_UNSUPPORTED_SCHEME, DrmResult.RESULT_ERROR_RESOURCE_BUSY"
         errorLine1="            return super.getResultCode();"
diff --git a/media2/media2-session/build.gradle b/media2/media2-session/build.gradle
index 25d2493..dbb6e4d 100644
--- a/media2/media2-session/build.gradle
+++ b/media2/media2-session/build.gradle
@@ -41,9 +41,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 16
-    }
     buildFeatures {
         aidl = true
     }
diff --git a/media2/media2-session/lint-baseline.xml b/media2/media2-session/lint-baseline.xml
index 089c752..910c728 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="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="WrongConstant"
@@ -65,6 +65,42 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/session/MediaControllerImplLegacy.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/session/MediaSessionImplBase.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    || (Build.VERSION.SDK_INT >= 19 &amp;&amp; value instanceof android.media.Rating)) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/session/MediaUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/session/SessionToken.java"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public void setTimeDiff(Long timeDiff) {"
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 8f6116c..67787e2 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="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -11,48 +11,12 @@
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="interface IRemoteMediaBrowserCompat {"
-        errorLine2="^">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/aidl/androidx/media2/test/common/IRemoteMediaBrowserCompat.aidl"/>
-    </issue>
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="interface IRemoteMediaController {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/media2/test/common/IRemoteMediaController.aidl"/>
-    </issue>
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="interface IRemoteMediaControllerCompat {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/media2/test/common/IRemoteMediaControllerCompat.aidl"/>
-    </issue>
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="interface IRemoteMediaSession {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/media2/test/common/IRemoteMediaSession.aidl"/>
-    </issue>
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="interface IRemoteMediaSessionCompat {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/media2/test/common/IRemoteMediaSessionCompat.aidl"/>
+            file="src/main/java/androidx/media2/test/common/TestUtils.java"/>
     </issue>
 
     <issue
diff --git a/media2/media2-session/version-compat-tests/current/client/build.gradle b/media2/media2-session/version-compat-tests/current/client/build.gradle
index 147a6a7..9f0c72d 100644
--- a/media2/media2-session/version-compat-tests/current/client/build.gradle
+++ b/media2/media2-session/version-compat-tests/current/client/build.gradle
@@ -30,9 +30,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 16
-    }
     namespace "androidx.media2.test.client"
 }
 
diff --git a/media2/media2-session/version-compat-tests/current/service/build.gradle b/media2/media2-session/version-compat-tests/current/service/build.gradle
index 61b94fc..2984c33 100644
--- a/media2/media2-session/version-compat-tests/current/service/build.gradle
+++ b/media2/media2-session/version-compat-tests/current/service/build.gradle
@@ -29,9 +29,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 16
-    }
     namespace "androidx.media2.test.service"
 }
 
diff --git a/media2/media2-session/version-compat-tests/previous/client/build.gradle b/media2/media2-session/version-compat-tests/previous/client/build.gradle
index 634a725..5ca0a2c 100644
--- a/media2/media2-session/version-compat-tests/previous/client/build.gradle
+++ b/media2/media2-session/version-compat-tests/previous/client/build.gradle
@@ -30,9 +30,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 16
-    }
     namespace "androidx.media2.test.client"
 }
 
diff --git a/media2/media2-session/version-compat-tests/previous/service/build.gradle b/media2/media2-session/version-compat-tests/previous/service/build.gradle
index 48791a6..0f6afc1 100644
--- a/media2/media2-session/version-compat-tests/previous/service/build.gradle
+++ b/media2/media2-session/version-compat-tests/previous/service/build.gradle
@@ -29,9 +29,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 16
-    }
     namespace "androidx.media2.test.service"
 }
 
diff --git a/media2/media2-widget/build.gradle b/media2/media2-widget/build.gradle
index b247d61..8089619 100644
--- a/media2/media2-widget/build.gradle
+++ b/media2/media2-widget/build.gradle
@@ -40,7 +40,6 @@
 
 android {
     defaultConfig {
-        minSdkVersion 16
         multiDexEnabled true
     }
     sourceSets {
diff --git a/media2/media2-widget/lint-baseline.xml b/media2/media2-widget/lint-baseline.xml
index 0b8527f..1ad87ad 100644
--- a/media2/media2-widget/lint-baseline.xml
+++ b/media2/media2-widget/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-beta03" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Class requires API level 24 (current min is 16): `android.view.PixelCopy.OnPixelCopyFinishedListener`"
+        message="Class requires API level 24 (current min is 19): `android.view.PixelCopy.OnPixelCopyFinishedListener`"
         errorLine1="                    PixelCopy.request(source, dest, new PixelCopy.OnPixelCopyFinishedListener() {"
         errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -82,4 +82,157 @@
             file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/CaptionStyle.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/CaptionStyle.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/CaptioningManagerHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/Cea708CaptionRenderer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/ClosedCaptionWidget.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/ClosedCaptionWidget.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/ClosedCaptionWidget.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (VERSION.SDK_INT &lt; 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/ClosedCaptionWidget.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        Locale selectedLocale = VERSION.SDK_INT >= 19"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        boolean selectForced = VERSION.SDK_INT >= 19"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            boolean captionIsEnabledOnSystem = VERSION.SDK_INT >= 19"
+        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                            if (mTracks.size() == 0 &amp;&amp; VERSION.SDK_INT >= 19) {"
+        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"/>
+    </issue>
+
 </issues>
diff --git a/mediarouter/mediarouter/api/api_lint.ignore b/mediarouter/mediarouter/api/api_lint.ignore
index e52c8a2..83bd524 100644
--- a/mediarouter/mediarouter/api/api_lint.ignore
+++ b/mediarouter/mediarouter/api/api_lint.ignore
@@ -97,8 +97,6 @@
     Inconsistent interface constant; expected 'androidx.mediarouter.media.MediaRouteProviderService'`
 
 
-InvalidNullabilityOverride: androidx.mediarouter.app.MediaRouteButton#onDraw(android.graphics.Canvas) parameter #0:
-    Invalid nullability on parameter `canvas` in method `onDraw`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.mediarouter.app.MediaRouteControllerDialog#onKeyDown(int, android.view.KeyEvent) parameter #1:
     Invalid nullability on parameter `event` in method `onKeyDown`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.mediarouter.app.MediaRouteControllerDialog#onKeyUp(int, android.view.KeyEvent) parameter #1:
@@ -139,6 +137,10 @@
     Missing nullability on field `EMPTY` in class `class androidx.mediarouter.media.MediaRouteSelector`
 
 
+NotCloseable: androidx.mediarouter.media.RemotePlaybackClient:
+    Classes that release resources (release(), stop()) should implement AutoCloseable and CloseGuard: class androidx.mediarouter.media.RemotePlaybackClient
+
+
 NullableCollection: androidx.mediarouter.media.MediaItemStatus#getExtras():
     Return type of method androidx.mediarouter.media.MediaItemStatus.getExtras() is a nullable collection (`android.os.Bundle`); must be non-null
 NullableCollection: androidx.mediarouter.media.MediaRouteDescriptor#getExtras():
diff --git a/mediarouter/mediarouter/lint-baseline.xml b/mediarouter/mediarouter/lint-baseline.xml
index db47a78..a65aeb4 100644
--- a/mediarouter/mediarouter/lint-baseline.xml
+++ b/mediarouter/mediarouter/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -29,42 +29,6 @@
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));"
-        errorLine2="                                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        blurScript.setRadius(radius);"
-        errorLine2="                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        blurScript.setInput(allocation);"
-        errorLine2="                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        blurScript.forEach(blurAllocation);"
-        errorLine2="                   ~~~~~~~">
-        <location
-            file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"/>
-    </issue>
-
-    <issue
         id="MissingTestSizeAnnotation"
         message="Missing test size annotation"
         errorLine1="    public void testReset() {"
@@ -82,4 +46,184 @@
             file="src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi16Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi16Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi16Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; 16 || Build.VERSION.SDK_INT > 17) {"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi16Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; 16 || Build.VERSION.SDK_INT > 17) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi16Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; 16 || Build.VERSION.SDK_INT > 17) {"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi16Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="            if (Build.VERSION.SDK_INT &lt; 16 || Build.VERSION.SDK_INT > 17) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi16Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(17)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi17Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT != 17) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi17Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT != 17) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/MediaRouterApi17Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/SystemMediaRouteProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/SystemMediaRouteProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/SystemMediaRouteProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/SystemMediaRouteProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/SystemMediaRouteProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/media/SystemMediaRouteProvider.java"/>
+    </issue>
+
 </issues>
diff --git a/metrics/metrics-performance/lint-baseline.xml b/metrics/metrics-performance/lint-baseline.xml
index ab6db8e..136717c 100644
--- a/metrics/metrics-performance/lint-baseline.xml
+++ b/metrics/metrics-performance/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-beta03" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -19,4 +19,49 @@
             file="src/androidTest/java/androidx/metrics/performance/test/MyCustomView.kt"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                Build.VERSION.SDK_INT >= 16 -> {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/metrics/performance/JankStats.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(16)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/metrics/performance/JankStatsInternalsForTesting.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/metrics/performance/JankStatsInternalsForTesting.kt"/>
+    </issue>
+
 </issues>
diff --git a/navigation/integration-tests/testapp/lint-baseline.xml b/navigation/integration-tests/testapp/lint-baseline.xml
index acc57fc..5c97efc 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="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="ClassVerificationFailure"
@@ -21,33 +21,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            val fade = Fade()"
-        errorLine2="                       ~~~~~~">
-        <location
-            file="src/main/java/androidx/navigation/testapp/HelpActivity.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            fade.excludeTarget(android.R.id.statusBarBackground, true)"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/navigation/testapp/HelpActivity.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            fade.excludeTarget(android.R.id.navigationBarBackground, true)"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/navigation/testapp/HelpActivity.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            window.exitTransition = fade"
         errorLine2="                   ~~~~~~~~~~~~~~">
diff --git a/navigation/navigation-common/lint-baseline.xml b/navigation/navigation-common/lint-baseline.xml
index b2e8e58..f57c19e 100644
--- a/navigation/navigation-common/lint-baseline.xml
+++ b/navigation/navigation-common/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Call requires API level 21 (current min is 14): `android.os.BaseBundle#get`"
+        message="Call requires API level 21 (current min is 19): `android.os.BaseBundle#get`"
         errorLine1="        if (!isNullable &amp;&amp; bundle.containsKey(name) &amp;&amp; bundle[name] == null) {"
         errorLine2="                                                                    ~~">
         <location
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
index 98d0bfd..494070f 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
@@ -32,12 +32,12 @@
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.rememberSaveableStateHolder
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalInspectionMode
 import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
 import androidx.navigation.NavBackStackEntry
@@ -49,7 +49,6 @@
 import androidx.navigation.Navigator
 import androidx.navigation.createGraph
 import androidx.navigation.get
-import kotlinx.coroutines.flow.map
 
 /**
  * Provides in place in the Compose hierarchy for self contained navigation to occur.
@@ -201,50 +200,44 @@
         "NavHost requires a ViewModelStoreOwner to be provided via LocalViewModelStoreOwner"
     }
 
-    // Intercept back only when there's a destination to pop
-    val currentBackStack by remember(navController.currentBackStack) {
-        navController.currentBackStack.map {
-            it.filter { entry ->
-                entry.destination.navigatorName == ComposeNavigator.NAME
-            }
-        }
-    }.collectAsState(emptyList())
-    BackHandler(currentBackStack.size > 1) {
-        navController.popBackStack()
-    }
-
-    // Setup the navController with proper owners
-    DisposableEffect(lifecycleOwner) {
-        // Setup the navController with proper owners
-        navController.setLifecycleOwner(lifecycleOwner)
-        onDispose { }
-    }
     navController.setViewModelStore(viewModelStoreOwner.viewModelStore)
 
     // Then set the graph
     navController.graph = graph
 
-    val saveableStateHolder = rememberSaveableStateHolder()
-
     // Find the ComposeNavigator, returning early if it isn't found
     // (such as is the case when using TestNavHostController)
     val composeNavigator = navController.navigatorProvider.get<Navigator<out NavDestination>>(
         ComposeNavigator.NAME
     ) as? ComposeNavigator ?: return
-    val visibleEntries by remember(navController.visibleEntries) {
-        navController.visibleEntries.map {
-            it.filter { entry ->
+
+    val currentBackStack by composeNavigator.backStack.collectAsState()
+
+    BackHandler(currentBackStack.size > 1) {
+        navController.popBackStack()
+    }
+
+    DisposableEffect(lifecycleOwner) {
+        // Setup the navController with proper owners
+        navController.setLifecycleOwner(lifecycleOwner)
+        onDispose { }
+    }
+
+    val saveableStateHolder = rememberSaveableStateHolder()
+
+    val allVisibleEntries by navController.visibleEntries.collectAsState()
+
+    // Intercept back only when there's a destination to pop
+    val visibleEntries by remember {
+        derivedStateOf {
+            allVisibleEntries.filter { entry ->
                 entry.destination.navigatorName == ComposeNavigator.NAME
             }
         }
-    }.collectAsState(emptyList())
-
-    val backStackEntry: NavBackStackEntry? = if (LocalInspectionMode.current) {
-        composeNavigator.backStack.value.lastOrNull()
-    } else {
-        visibleEntries.lastOrNull()
     }
 
+    val backStackEntry: NavBackStackEntry? = visibleEntries.lastOrNull()
+
     val zIndices = remember { mutableMapOf<String, Float>() }
 
     if (backStackEntry != null) {
@@ -306,12 +299,7 @@
             // animating. In these cases the currentEntry will be null, and in those cases,
             // AnimatedContent will just skip attempting to transition the old entry.
             // See https://issuetracker.google.com/238686802
-            val currentEntry = if (LocalInspectionMode.current) {
-                // show startDestination if inspecting (preview)
-                composeNavigator.backStack.value
-            } else {
-                visibleEntries
-            }.lastOrNull { entry -> it == entry }
+            val currentEntry = visibleEntries.lastOrNull { entry -> it == entry }
 
             // while in the scope of the composable, we provide the navBackStackEntry as the
             // ViewModelStoreOwner and LifecycleOwner
diff --git a/navigation/navigation-fragment/api/api_lint.ignore b/navigation/navigation-fragment/api/api_lint.ignore
index b57faea..05fb76a 100644
--- a/navigation/navigation-fragment/api/api_lint.ignore
+++ b/navigation/navigation-fragment/api/api_lint.ignore
@@ -1,11 +1,3 @@
 // Baseline format: 1.0
 DocumentExceptions: androidx.navigation.fragment.FragmentNavArgsLazyKt#navArgs(androidx.fragment.app.Fragment):
     Method FragmentNavArgsLazyKt.navArgs appears to be throwing java.lang.IllegalStateException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions
-
-
-MissingNullability: androidx.navigation.NavGraphViewModelLazyKt#navGraphViewModels(androidx.fragment.app.Fragment, String, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>):
-    Missing nullability on method `navGraphViewModels` return
-MissingNullability: androidx.navigation.NavGraphViewModelLazyKt#navGraphViewModels(androidx.fragment.app.Fragment, int, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>):
-    Missing nullability on method `navGraphViewModels` return
-MissingNullability: androidx.navigation.fragment.FragmentNavArgsLazyKt#navArgs(androidx.fragment.app.Fragment):
-    Missing nullability on method `navArgs` return
diff --git a/navigation/navigation-runtime/api/api_lint.ignore b/navigation/navigation-runtime/api/api_lint.ignore
index 0f5a137..787c8db 100644
--- a/navigation/navigation-runtime/api/api_lint.ignore
+++ b/navigation/navigation-runtime/api/api_lint.ignore
@@ -17,10 +17,6 @@
     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
 
 
-MissingNullability: androidx.navigation.ActivityNavArgsLazyKt#navArgs(android.app.Activity):
-    Missing nullability on method `navArgs` return
-
-
 NullableCollection: androidx.navigation.NavController#saveState():
     Return type of method androidx.navigation.NavController.saveState() is a nullable collection (`android.os.Bundle`); must be non-null
 NullableCollection: androidx.navigation.NavController.OnDestinationChangedListener#onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle) parameter #2:
diff --git a/paging/integration-tests/testapp/build.gradle b/paging/integration-tests/testapp/build.gradle
index 97d3651..dd6fc23 100644
--- a/paging/integration-tests/testapp/build.gradle
+++ b/paging/integration-tests/testapp/build.gradle
@@ -22,6 +22,8 @@
 }
 
 dependencies {
+    implementation(libs.multidex)
+
     implementation("androidx.arch.core:core-runtime:2.2.0")
     implementation(projectOrArtifact(":room:room-ktx"))
     implementation(projectOrArtifact(":room:room-rxjava2"))
@@ -44,10 +46,14 @@
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.truth)
+    androidTestImplementation(project(":annotation:annotation"))
 }
 
 android {
     namespace "androidx.paging.integration.testapp"
+    defaultConfig {
+        multiDexEnabled = true
+    }
 }
 
 // Enable parameter names to support Room incremental when its a project() dep.
diff --git a/paging/paging-testing/build.gradle b/paging/paging-testing/build.gradle
index a17e9a1..2955b5f 100644
--- a/paging/paging-testing/build.gradle
+++ b/paging/paging-testing/build.gradle
@@ -46,8 +46,16 @@
             }
         }
 
+        commonJvmMain {
+            dependsOn(commonMain)
+        }
+
+        jvmMain {
+            dependsOn(commonJvmMain)
+        }
+
         androidMain {
-            dependsOn(jvmMain)
+            dependsOn(commonJvmMain)
         }
 
         commonTest {
@@ -59,15 +67,19 @@
             }
         }
 
-        jvmTest {
+        commonJvmTest {
             dependsOn(commonTest)
             dependencies {
                 implementation(libs.junit)
             }
         }
 
+        jvmTest {
+            dependsOn(commonJvmTest)
+        }
+
         androidInstrumentedTest {
-            dependsOn(jvmTest)
+            dependsOn(commonJvmTest)
             dependencies {
                 implementation(libs.testRunner)
             }
diff --git a/paging/paging-testing/src/jvmMain/kotlin/androidx/paging/testing/internal/Atomics.jvm.kt b/paging/paging-testing/src/commonJvmMain/kotlin/androidx/paging/testing/internal/Atomics.jvm.kt
similarity index 100%
rename from paging/paging-testing/src/jvmMain/kotlin/androidx/paging/testing/internal/Atomics.jvm.kt
rename to paging/paging-testing/src/commonJvmMain/kotlin/androidx/paging/testing/internal/Atomics.jvm.kt
diff --git a/percentlayout/percentlayout/lint-baseline.xml b/percentlayout/percentlayout/lint-baseline.xml
new file mode 100644
index 0000000..0ce4092
--- /dev/null
+++ b/percentlayout/percentlayout/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(19)"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/percentlayout/widget/PercentFrameLayout.java"/>
+    </issue>
+
+</issues>
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index 76ac2de..b314955 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -25,6 +25,6 @@
 kotlin.code.style=official
 # Disable docs
 androidx.enableDocumentation=false
-androidx.playground.snapshotBuildId=10850101
-androidx.playground.metalavaBuildId=10910286
+androidx.playground.snapshotBuildId=10956675
+androidx.playground.metalavaBuildId=10969629
 androidx.studio.type=playground
\ No newline at end of file
diff --git a/print/print/lint-baseline.xml b/print/print/lint-baseline.xml
new file mode 100644
index 0000000..f6d68dc
--- /dev/null
+++ b/print/print/lint-baseline.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        return Build.VERSION.SDK_INT >= 19;"
+        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19 &amp;&amp; mOrientation == 0) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19 || bitmap == null) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/print/PrintHelper.java"/>
+    </issue>
+
+</issues>
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/lint-baseline.xml b/privacysandbox/sdkruntime/sdkruntime-client/lint-baseline.xml
index 61827de..fdc15ae 100644
--- a/privacysandbox/sdkruntime/sdkruntime-client/lint-baseline.xml
+++ b/privacysandbox/sdkruntime/sdkruntime-client/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -64,4 +64,22 @@
             file="src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompat.kt"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= JELLY_BEAN_MR2) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorage.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(JELLY_BEAN_MR2)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorage.kt"/>
+    </issue>
+
 </issues>
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/AnnotatedClassReader.kt b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/AnnotatedClassReader.kt
index ef6c9994..229f25e 100644
--- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/AnnotatedClassReader.kt
+++ b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/AnnotatedClassReader.kt
@@ -102,7 +102,7 @@
         )
 
         return when (val metadata = KotlinClassMetadata.read(metadataAnnotation)) {
-            is KotlinClassMetadata.Class -> metadata.toKmClass()
+            is KotlinClassMetadata.Class -> metadata.kmClass
             else -> throw PrivacySandboxParsingException(
                 "Unable to parse Kotlin metadata from ${classNode.name}. " +
                     "Is this a valid Kotlin class?"
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt
index f0bb98a..215b9bd 100644
--- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt
+++ b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt
@@ -26,13 +26,18 @@
 import androidx.privacysandbox.tools.core.model.ValueProperty
 import androidx.privacysandbox.tools.core.validator.ModelValidator
 import java.nio.file.Path
+import kotlinx.metadata.ClassKind
 import kotlinx.metadata.ClassName
-import kotlinx.metadata.Flag
 import kotlinx.metadata.KmClass
 import kotlinx.metadata.KmClassifier
 import kotlinx.metadata.KmFunction
 import kotlinx.metadata.KmProperty
 import kotlinx.metadata.KmType
+import kotlinx.metadata.isData
+import kotlinx.metadata.isNullable
+import kotlinx.metadata.isSuspend
+import kotlinx.metadata.isVar
+import kotlinx.metadata.kind
 
 internal object ApiStubParser {
     /**
@@ -58,7 +63,7 @@
         val type = parseClassName(service.name)
         val superTypes = service.supertypes.map(this::parseType).filterNot { it == Types.any }
 
-        if (!Flag.Class.IS_INTERFACE(service.flags)) {
+        if (service.kind != ClassKind.INTERFACE) {
             throw PrivacySandboxParsingException(
                 "${type.qualifiedName} is not a Kotlin interface but it's annotated with " +
                     "@$annotationName."
@@ -75,7 +80,7 @@
     private fun parseValue(value: KmClass): AnnotatedValue {
         val type = parseClassName(value.name)
 
-        if (!Flag.Class.IS_DATA(value.flags)) {
+        if (!value.isData) {
             throw PrivacySandboxParsingException(
                 "${type.qualifiedName} is not a Kotlin data class but it's annotated with " +
                     "@PrivacySandboxValue."
@@ -100,7 +105,7 @@
 
     private fun parseProperty(containerType: Type, property: KmProperty): ValueProperty {
         val qualifiedName = "${containerType.qualifiedName}.${property.name}"
-        if (Flag.Property.IS_VAR(property.flags)) {
+        if (property.isVar) {
             throw PrivacySandboxParsingException(
                 "Error in $qualifiedName: mutable properties are not allowed in data classes " +
                     "annotated with @PrivacySandboxValue."
@@ -114,13 +119,13 @@
             function.name,
             function.valueParameters.map { Parameter(it.name, parseType(it.type)) },
             parseType(function.returnType),
-            Flag.Function.IS_SUSPEND(function.flags)
+            function.isSuspend
         )
     }
 
     private fun parseType(type: KmType): Type {
         val classifier = type.classifier
-        val isNullable = Flag.Type.IS_NULLABLE(type.flags)
+        val isNullable = type.isNullable
         if (classifier !is KmClassifier.Class) {
             throw PrivacySandboxParsingException("Unsupported type in API description: $type")
         }
diff --git a/privacysandbox/ui/integration-tests/testaidl/lint-baseline.xml b/privacysandbox/ui/integration-tests/testaidl/lint-baseline.xml
deleted file mode 100644
index 53c1983..0000000
--- a/privacysandbox/ui/integration-tests/testaidl/lint-baseline.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="interface ISdkApi {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/privacysandbox/ui/integration/testaidl/ISdkApi.aidl"/>
-    </issue>
-
-</issues>
diff --git a/privacysandbox/ui/ui-core/lint-baseline.xml b/privacysandbox/ui/ui-core/lint-baseline.xml
deleted file mode 100644
index 263abb0..0000000
--- a/privacysandbox/ui/ui-core/lint-baseline.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="oneway interface IRemoteSessionClient {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/privacysandbox/ui/core/IRemoteSessionClient.aidl"/>
-    </issue>
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="oneway interface IRemoteSessionController {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/privacysandbox/ui/core/IRemoteSessionController.aidl"/>
-    </issue>
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="oneway interface ISandboxedUiAdapter {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/privacysandbox/ui/core/ISandboxedUiAdapter.aidl"/>
-    </issue>
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="oneway interface ISdkActivityLauncher {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/privacysandbox/ui/core/ISdkActivityLauncher.aidl"/>
-    </issue>
-
-    <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="oneway interface ISdkActivityLauncherCallback {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/privacysandbox/ui/core/ISdkActivityLauncherCallback.aidl"/>
-    </issue>
-
-</issues>
diff --git a/profileinstaller/profileinstaller/lint-baseline.xml b/profileinstaller/profileinstaller/lint-baseline.xml
new file mode 100644
index 0000000..480387a
--- /dev/null
+++ b/profileinstaller/profileinstaller/lint-baseline.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/profileinstaller/DeviceProfileWriter.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/profileinstaller/Encoding.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.KITKAT) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/profileinstaller/ProfileInstaller.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/profileinstaller/ProfileInstallerInitializer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/profileinstaller/ProfileInstallerInitializer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/profileinstaller/ProfileTranscoder.java"/>
+    </issue>
+
+</issues>
diff --git a/recyclerview/recyclerview/api/api_lint.ignore b/recyclerview/recyclerview/api/api_lint.ignore
index 463599f..66d9027 100644
--- a/recyclerview/recyclerview/api/api_lint.ignore
+++ b/recyclerview/recyclerview/api/api_lint.ignore
@@ -161,36 +161,6 @@
     Internal field mLayoutManager must not be exposed
 
 
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent) parameter #0:
-    Invalid nullability on parameter `host` in method `dispatchPopulateAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent) parameter #1:
-    Invalid nullability on parameter `event` in method `dispatchPopulateAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#getAccessibilityNodeProvider(android.view.View):
-    Invalid nullability on method `getAccessibilityNodeProvider` return. Overrides of unannotated super method cannot be Nullable.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#getAccessibilityNodeProvider(android.view.View) parameter #0:
-    Invalid nullability on parameter `host` in method `getAccessibilityNodeProvider`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent) parameter #0:
-    Invalid nullability on parameter `host` in method `onInitializeAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent) parameter #1:
-    Invalid nullability on parameter `event` in method `onInitializeAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent) parameter #0:
-    Invalid nullability on parameter `host` in method `onPopulateAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent) parameter #1:
-    Invalid nullability on parameter `event` in method `onPopulateAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent) parameter #0:
-    Invalid nullability on parameter `host` in method `onRequestSendAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent) parameter #1:
-    Invalid nullability on parameter `child` in method `onRequestSendAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent) parameter #2:
-    Invalid nullability on parameter `event` in method `onRequestSendAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#sendAccessibilityEvent(android.view.View, int) parameter #0:
-    Invalid nullability on parameter `host` in method `sendAccessibilityEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent) parameter #0:
-    Invalid nullability on parameter `host` in method `sendAccessibilityEventUnchecked`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate.ItemDelegate#sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent) parameter #1:
-    Invalid nullability on parameter `event` in method `sendAccessibilityEventUnchecked`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-
-
 KotlinOperator: androidx.recyclerview.widget.RecyclerView.State#get(int):
     Method can be invoked with an indexing operator from Kotlin: `get` (this is usually desirable; just make sure it makes sense for this type of object)
 KotlinOperator: androidx.recyclerview.widget.SortedList#get(int):
@@ -545,10 +515,6 @@
     Missing nullability on parameter `container` in method `dispatchRestoreInstanceState`
 MissingNullability: androidx.recyclerview.widget.RecyclerView#dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>) parameter #0:
     Missing nullability on parameter `container` in method `dispatchSaveInstanceState`
-MissingNullability: androidx.recyclerview.widget.RecyclerView#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `c` in method `draw`
-MissingNullability: androidx.recyclerview.widget.RecyclerView#drawChild(android.graphics.Canvas, android.view.View, long) parameter #0:
-    Missing nullability on parameter `canvas` in method `drawChild`
 MissingNullability: androidx.recyclerview.widget.RecyclerView#drawChild(android.graphics.Canvas, android.view.View, long) parameter #1:
     Missing nullability on parameter `child` in method `drawChild`
 MissingNullability: androidx.recyclerview.widget.RecyclerView#findViewHolderForItemId(long):
@@ -571,8 +537,6 @@
     Missing nullability on method `getAccessibilityClassName` return
 MissingNullability: androidx.recyclerview.widget.RecyclerView#getChildViewHolder(android.view.View):
     Missing nullability on method `getChildViewHolder` return
-MissingNullability: androidx.recyclerview.widget.RecyclerView#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `c` in method `onDraw`
 MissingNullability: androidx.recyclerview.widget.RecyclerView#onGenericMotionEvent(android.view.MotionEvent) parameter #0:
     Missing nullability on parameter `event` in method `onGenericMotionEvent`
 MissingNullability: androidx.recyclerview.widget.RecyclerView#onInterceptTouchEvent(android.view.MotionEvent) parameter #0:
@@ -891,6 +855,10 @@
     Bare field stackFromEnd must be marked final, or moved behind accessors if mutable
 
 
+NotCloseable: androidx.recyclerview.widget.RecyclerView.SmoothScroller:
+    Classes that release resources (stop()) should implement AutoCloseable and CloseGuard: class androidx.recyclerview.widget.RecyclerView.SmoothScroller
+
+
 PublicTypedef: androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection:
     Don't expose @IntDef: EdgeDirection must be hidden.
 PublicTypedef: androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges:
diff --git a/recyclerview/recyclerview/lint-baseline.xml b/recyclerview/recyclerview/lint-baseline.xml
index 8431f20..1e9ffd1 100644
--- a/recyclerview/recyclerview/lint-baseline.xml
+++ b/recyclerview/recyclerview/lint-baseline.xml
@@ -1,32 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-beta03" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 16 (current min is 14): `android.view.View#getMinimumWidth`"
-        errorLine1="                            getMinimumWidth()),"
-        errorLine2="                            ~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/recyclerview/widget/TestedFrameLayout.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 16 (current min is 14): `android.view.View#getMinimumHeight`"
-        errorLine1="                            getMinimumHeight()));"
-        errorLine2="                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/recyclerview/widget/TestedFrameLayout.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `new android.widget.FrameLayout.LayoutParams`"
-        errorLine1="            super(source);"
-        errorLine2="            ~~~~~">
-        <location
-            file="src/androidTest/java/androidx/recyclerview/widget/TestedFrameLayout.java"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -290,6 +263,60 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/recyclerview/widget/GridLayoutManager.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="    static final boolean FORCE_INVALIDATE_DISPLAY_LIST = Build.VERSION.SDK_INT == 18"
+        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    static final boolean POST_UPDATES_ON_ANIMATION = Build.VERSION.SDK_INT >= 16;"
+        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="    private static final boolean FORCE_ABS_FOCUS_SEARCH_DIRECTION = Build.VERSION.SDK_INT &lt;= 15;"
+        errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="    private static final boolean IGNORE_DETACHED_FOCUSED_CHILD = Build.VERSION.SDK_INT &lt;= 15;"
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"/>
+    </issue>
+
+    <issue
         id="KotlinPropertyAccess"
         message="This method should be called `getHasFixedSize` such that `hasFixedSize` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public boolean hasFixedSize() {"
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/StretchEdgeEffectTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/StretchEdgeEffectTest.java
index 9de5f8e..3173f93 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/StretchEdgeEffectTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/StretchEdgeEffectTest.java
@@ -380,11 +380,9 @@
         scrollToPosition(0);
         waitForIdleScroll(mRecyclerView);
 
-        float[] startPullDistance = new float[1];
         dragHorizontally(1000, () -> {
             mFactory.mLeft.mAbsorbVelocity = 0;
             float pullDistance = EdgeEffectCompat.getDistance(mFactory.mLeft);
-            startPullDistance[0] = pullDistance;
             assertTrue(pullDistance > 0);
             assertTrue(mRecyclerView.fling(10000, 0));
             assertEquals(pullDistance, EdgeEffectCompat.getDistance(mFactory.mLeft), 0.01f);
@@ -396,12 +394,6 @@
         mActivityRule.runOnUiThread(() -> mRecyclerView.postOnAnimation(animationLatch::countDown));
         assertTrue(animationLatch.await(1, TimeUnit.SECONDS));
 
-        // Now make sure the stretch is being released:
-        mActivityRule.runOnUiThread(() -> {
-            float pullDistance = EdgeEffectCompat.getDistance(mFactory.mLeft);
-            assertTrue(pullDistance < startPullDistance[0]);
-        });
-
         // Wait for the stretch to be fully released:
         float[] currentPullDistance = new float[1];
         long start = SystemClock.uptimeMillis();
@@ -431,11 +423,9 @@
         scrollToPosition(0);
         waitForIdleScroll(mRecyclerView);
 
-        float[] startPullDistance = new float[1];
         dragVertically(1000, () -> {
             mFactory.mTop.mAbsorbVelocity = 0;
             float pullDistance = EdgeEffectCompat.getDistance(mFactory.mTop);
-            startPullDistance[0] = pullDistance;
             assertTrue(pullDistance > 0);
             assertTrue(mRecyclerView.fling(0, 10000));
             assertEquals(pullDistance, EdgeEffectCompat.getDistance(mFactory.mTop), 0.01f);
@@ -447,12 +437,6 @@
         mActivityRule.runOnUiThread(() -> mRecyclerView.postOnAnimation(animationLatch::countDown));
         assertTrue(animationLatch.await(1, TimeUnit.SECONDS));
 
-        // Now make sure the stretch is being released:
-        mActivityRule.runOnUiThread(() -> {
-            float pullDistance = EdgeEffectCompat.getDistance(mFactory.mTop);
-            assertTrue(pullDistance < startPullDistance[0]);
-        });
-
         // Wait for the stretch to be fully released:
         float[] currentPullDistance = new float[1];
         long start = SystemClock.uptimeMillis();
@@ -484,13 +468,11 @@
         scrollToPosition(NUM_ITEMS - 1);
         waitForIdleScroll(mRecyclerView);
 
-        float[] startPullDistance = new float[1];
         int[] lastItemPosition = new int[1];
         dragHorizontally(-1000, () -> {
             lastItemPosition[0] = mLayoutManager.findLastVisibleItemPosition();
             mFactory.mRight.mAbsorbVelocity = 0;
             float pullDistance = EdgeEffectCompat.getDistance(mFactory.mRight);
-            startPullDistance[0] = pullDistance;
             assertTrue(pullDistance > 0);
             assertTrue(mRecyclerView.fling(-10000, 0));
             assertEquals(pullDistance, EdgeEffectCompat.getDistance(mFactory.mRight), 0.01f);
@@ -502,12 +484,6 @@
         mActivityRule.runOnUiThread(() -> mRecyclerView.postOnAnimation(animationLatch::countDown));
         assertTrue(animationLatch.await(1, TimeUnit.SECONDS));
 
-        // Now make sure the stretch is being released:
-        mActivityRule.runOnUiThread(() -> {
-            float pullDistance = EdgeEffectCompat.getDistance(mFactory.mRight);
-            assertTrue(pullDistance < startPullDistance[0]);
-        });
-
         // Wait for the stretch to be fully released:
         float[] currentPullDistance = new float[1];
         long start = SystemClock.uptimeMillis();
@@ -537,13 +513,11 @@
         scrollToPosition(NUM_ITEMS - 1);
         waitForIdleScroll(mRecyclerView);
 
-        float[] startPullDistance = new float[1];
         int[] lastItemPosition = new int[1];
         dragVertically(-1000, () -> {
             lastItemPosition[0] = mLayoutManager.findLastVisibleItemPosition();
             mFactory.mBottom.mAbsorbVelocity = 0;
             float pullDistance = EdgeEffectCompat.getDistance(mFactory.mBottom);
-            startPullDistance[0] = pullDistance;
             assertTrue(pullDistance > 0);
             assertTrue(mRecyclerView.fling(0, -10000));
             assertEquals(pullDistance, EdgeEffectCompat.getDistance(mFactory.mBottom), 0.01f);
@@ -555,12 +529,6 @@
         mActivityRule.runOnUiThread(() -> mRecyclerView.postOnAnimation(animationLatch::countDown));
         assertTrue(animationLatch.await(1, TimeUnit.SECONDS));
 
-        // Now make sure the stretch is being released:
-        mActivityRule.runOnUiThread(() -> {
-            float pullDistance = EdgeEffectCompat.getDistance(mFactory.mBottom);
-            assertTrue(pullDistance < startPullDistance[0]);
-        });
-
         // Wait for the stretch to be fully released:
         float[] currentPullDistance = new float[1];
         long start = SystemClock.uptimeMillis();
diff --git a/room/integration-tests/noappcompattestapp/build.gradle b/room/integration-tests/noappcompattestapp/build.gradle
index 07dfb8c7..0bc9959 100644
--- a/room/integration-tests/noappcompattestapp/build.gradle
+++ b/room/integration-tests/noappcompattestapp/build.gradle
@@ -30,6 +30,7 @@
     androidTestImplementation(libs.testCore)
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(project(":annotation:annotation"))
     testImplementation(libs.junit)
 }
 
diff --git a/room/integration-tests/testapp/lint-baseline.xml b/room/integration-tests/testapp/lint-baseline.xml
index 2867962..92e25cf 100644
--- a/room/integration-tests/testapp/lint-baseline.xml
+++ b/room/integration-tests/testapp/lint-baseline.xml
@@ -1,41 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `new java.lang.AssertionError`"
-        errorLine1="            throw new AssertionError(&quot;interrupted&quot;, e);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/room/integration/testapp/test/QueryTransactionTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `new java.lang.AssertionError`"
-        errorLine1="            throw new AssertionError(&quot;drain timed out&quot;, e);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/room/integration/testapp/test/QueryTransactionTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `new java.lang.AssertionError`"
-        errorLine1="            throw new AssertionError(&quot;interrupted&quot;, e);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/room/integration/testapp/test/QueryTransactionTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `new java.lang.AssertionError`"
-        errorLine1="            throw new AssertionError(&quot;execution error&quot;, e);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/room/integration/testapp/test/QueryTransactionTest.java"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -164,15 +128,6 @@
     </issue>
 
     <issue
-        id="RequireUnstableAidlAnnotation"
-        message="Unstable AIDL files must be annotated with `@RequiresOptIn` marker"
-        errorLine1="interface ISampleDatabaseService {"
-        errorLine2="^">
-        <location
-            file="src/main/aidl/androidx/room/integration/testapp/ISampleDatabaseService.aidl"/>
-    </issue>
-
-    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getName() {"
diff --git a/room/room-common/api/current.txt b/room/room-common/api/current.txt
index a00c4db..fd67b3b 100644
--- a/room/room-common/api/current.txt
+++ b/room/room-common/api/current.txt
@@ -104,23 +104,31 @@
     property public abstract Class<?> entity;
   }
 
-  @java.lang.annotation.Repeatable(DeleteColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteColumn {
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteColumn {
     method public abstract String columnName();
     method public abstract String tableName();
     property public abstract String columnName;
     property public abstract String tableName;
   }
 
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteColumn.Container {
+    method public abstract androidx.room.DeleteColumn[] value();
+  }
+
   @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteColumn.Entries {
     method public abstract androidx.room.DeleteColumn[] value();
     property public abstract androidx.room.DeleteColumn[] value;
   }
 
-  @java.lang.annotation.Repeatable(DeleteTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteTable {
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteTable {
     method public abstract String tableName();
     property public abstract String tableName;
   }
 
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteTable.Container {
+    method public abstract androidx.room.DeleteTable[] value();
+  }
+
   @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteTable.Entries {
     method public abstract androidx.room.DeleteTable[] value();
     property public abstract androidx.room.DeleteTable[] value;
@@ -334,7 +342,7 @@
     property public abstract String[] projection;
   }
 
-  @java.lang.annotation.Repeatable(RenameColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameColumn {
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameColumn {
     method public abstract String fromColumnName();
     method public abstract String tableName();
     method public abstract String toColumnName();
@@ -343,18 +351,26 @@
     property public abstract String toColumnName;
   }
 
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameColumn.Container {
+    method public abstract androidx.room.RenameColumn[] value();
+  }
+
   @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameColumn.Entries {
     method public abstract androidx.room.RenameColumn[] value();
     property public abstract androidx.room.RenameColumn[] value;
   }
 
-  @java.lang.annotation.Repeatable(RenameTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameTable {
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameTable {
     method public abstract String fromTableName();
     method public abstract String toTableName();
     property public abstract String fromTableName;
     property public abstract String toTableName;
   }
 
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameTable.Container {
+    method public abstract androidx.room.RenameTable[] value();
+  }
+
   @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameTable.Entries {
     method public abstract androidx.room.RenameTable[] value();
     property public abstract androidx.room.RenameTable[] value;
diff --git a/room/room-common/api/restricted_current.txt b/room/room-common/api/restricted_current.txt
index 4512daa..32582e2 100644
--- a/room/room-common/api/restricted_current.txt
+++ b/room/room-common/api/restricted_current.txt
@@ -104,23 +104,31 @@
     property public abstract Class<?> entity;
   }
 
-  @java.lang.annotation.Repeatable(DeleteColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteColumn {
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteColumn {
     method public abstract String columnName();
     method public abstract String tableName();
     property public abstract String columnName;
     property public abstract String tableName;
   }
 
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteColumn.Container {
+    method public abstract androidx.room.DeleteColumn[] value();
+  }
+
   @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteColumn.Entries {
     method public abstract androidx.room.DeleteColumn[] value();
     property public abstract androidx.room.DeleteColumn[] value;
   }
 
-  @java.lang.annotation.Repeatable(DeleteTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteTable {
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteTable {
     method public abstract String tableName();
     property public abstract String tableName;
   }
 
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteTable.Container {
+    method public abstract androidx.room.DeleteTable[] value();
+  }
+
   @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteTable.Entries {
     method public abstract androidx.room.DeleteTable[] value();
     property public abstract androidx.room.DeleteTable[] value;
@@ -334,7 +342,7 @@
     property public abstract String[] projection;
   }
 
-  @java.lang.annotation.Repeatable(RenameColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameColumn {
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameColumn {
     method public abstract String fromColumnName();
     method public abstract String tableName();
     method public abstract String toColumnName();
@@ -343,18 +351,26 @@
     property public abstract String toColumnName;
   }
 
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameColumn.Container {
+    method public abstract androidx.room.RenameColumn[] value();
+  }
+
   @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameColumn.Entries {
     method public abstract androidx.room.RenameColumn[] value();
     property public abstract androidx.room.RenameColumn[] value;
   }
 
-  @java.lang.annotation.Repeatable(RenameTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameTable {
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameTable {
     method public abstract String fromTableName();
     method public abstract String toTableName();
     property public abstract String fromTableName;
     property public abstract String toTableName;
   }
 
+  @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameTable.Container {
+    method public abstract androidx.room.RenameTable[] value();
+  }
+
   @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameTable.Entries {
     method public abstract androidx.room.RenameTable[] value();
     property public abstract androidx.room.RenameTable[] value;
diff --git a/room/room-common/build.gradle b/room/room-common/build.gradle
index 49e5177..cdbee57 100644
--- a/room/room-common/build.gradle
+++ b/room/room-common/build.gradle
@@ -41,14 +41,27 @@
         commonMain {
             dependencies {
                 api(libs.kotlinStdlib)
-                api("androidx.annotation:annotation:1.3.0")
+                api(projectOrArtifact(":annotation:annotation"))
+
             }
         }
+
         commonTest {
             dependencies {
                 implementation(project(":kruth:kruth"))
-                implementation(libs.junit)
+                implementation(libs.kotlinTest)
+            }
+        }
+
+        jvmMain {
+            dependsOn(commonMain)
+        }
+
+        jvmTest {
+            dependsOn(commonTest)
+            dependencies {
                 implementation(libs.guava)
+                implementation(libs.kotlinTestJunit)
             }
         }
     }
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/AmbiguousColumnResolver.kt b/room/room-common/src/commonMain/kotlin/androidx/room/AmbiguousColumnResolver.kt
index ed818bf..a1c8345 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/AmbiguousColumnResolver.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/AmbiguousColumnResolver.kt
@@ -17,7 +17,7 @@
 package androidx.room
 
 import androidx.annotation.RestrictTo
-import java.util.Locale
+import kotlin.jvm.JvmStatic
 
 /**
  * Utility class for resolving and mapping ambiguous columns from a query result.
@@ -73,11 +73,11 @@
                 column.substring(1, column.length - 1)
             } else {
                 column
-            }.lowercase(Locale.US)
+            }.lowercase()
         }
         for (i in mappings.indices) {
             for (j in mappings[i].indices) {
-                mappings[i][j] = mappings[i][j].lowercase(Locale.US)
+                mappings[i][j] = mappings[i][j].lowercase()
             }
         }
 
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/ColumnInfo.kt b/room/room-common/src/commonMain/kotlin/androidx/room/ColumnInfo.kt
index 0c4561f..72b7d8f 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/ColumnInfo.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/ColumnInfo.kt
@@ -45,7 +45,7 @@
      * @return The type affinity of the column. This is either [UNDEFINED], [TEXT],
      * [INTEGER], [REAL], or [BLOB].
      */
-    @SuppressWarnings("unused")
+    @Suppress("unused")
     @get:SQLiteTypeAffinity
     val typeAffinity: Int = UNDEFINED,
 
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/DeleteColumn.kt b/room/room-common/src/commonMain/kotlin/androidx/room/DeleteColumn.kt
index 1f90a85..79c3623 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/DeleteColumn.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/DeleteColumn.kt
@@ -22,7 +22,7 @@
  *
  * @see AutoMigration
  */
-@JvmRepeatable(DeleteColumn.Entries::class)
+@Repeatable
 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.BINARY)
 public annotation class DeleteColumn(
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/DeleteTable.kt b/room/room-common/src/commonMain/kotlin/androidx/room/DeleteTable.kt
index 7aaaf51..c35bf9bd 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/DeleteTable.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/DeleteTable.kt
@@ -22,7 +22,7 @@
  *
  * @see AutoMigration
  */
-@JvmRepeatable(DeleteTable.Entries::class)
+@Repeatable
 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.BINARY)
 public annotation class DeleteTable(
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/FtsOptions.kt b/room/room-common/src/commonMain/kotlin/androidx/room/FtsOptions.kt
index 109d38a..1a88b21 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/FtsOptions.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/FtsOptions.kt
@@ -19,6 +19,7 @@
 package androidx.room
 
 import androidx.annotation.RequiresApi
+import kotlin.jvm.JvmName
 
 /**
  * Available option values that can be used with [Fts3] & [Fts4].
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/RenameColumn.kt b/room/room-common/src/commonMain/kotlin/androidx/room/RenameColumn.kt
index f52f790..5ba8b44 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/RenameColumn.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/RenameColumn.kt
@@ -22,7 +22,7 @@
  *
  * @see AutoMigration
  */
-@JvmRepeatable(RenameColumn.Entries::class)
+@Repeatable
 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.BINARY)
 public annotation class RenameColumn(
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/RenameTable.kt b/room/room-common/src/commonMain/kotlin/androidx/room/RenameTable.kt
index 2783e86..440b8ef 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/RenameTable.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/RenameTable.kt
@@ -22,7 +22,7 @@
  * @see [AutoMigration]
  *
  */
-@JvmRepeatable(RenameTable.Entries::class)
+@Repeatable
 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.BINARY)
 public annotation class RenameTable(
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/RoomMasterTable.kt b/room/room-common/src/commonMain/kotlin/androidx/room/RoomMasterTable.kt
index 4af3272..e316ed6 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/RoomMasterTable.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/RoomMasterTable.kt
@@ -18,12 +18,14 @@
 package androidx.room
 
 import androidx.annotation.RestrictTo
+import kotlin.jvm.JvmName
+import kotlin.jvm.JvmStatic
 
 /**
  * Schema information about Room's master table.
  *
  */
-@SuppressWarnings("WeakerAccess")
+@Suppress("WeakerAccess")
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
 public object RoomMasterTable {
     /**
diff --git a/room/room-common/src/commonMain/kotlin/androidx/room/RoomWarnings.kt b/room/room-common/src/commonMain/kotlin/androidx/room/RoomWarnings.kt
index 8031af0..3a9645a 100644
--- a/room/room-common/src/commonMain/kotlin/androidx/room/RoomWarnings.kt
+++ b/room/room-common/src/commonMain/kotlin/androidx/room/RoomWarnings.kt
@@ -21,7 +21,7 @@
  * You can use these values inside a [SuppressWarnings] annotation to disable the warnings.
  */
 // If you change this, don't forget to change androidx.room.vo.Warning
-@SuppressWarnings("unused", "WeakerAccess")
+@Suppress("unused", "WeakerAccess")
 public open class RoomWarnings {
     public companion object {
         /**
@@ -210,6 +210,6 @@
     }
 
     @Deprecated("This type should not be instantiated as it contains only static methods. ")
-    @SuppressWarnings("PrivateConstructorForUtilityClass")
+    @Suppress("PrivateConstructorForUtilityClass")
     public constructor()
 }
diff --git a/room/room-common/src/commonTest/kotlin/androidx/room/AmbiguousColumnResolverTest.kt b/room/room-common/src/commonTest/kotlin/androidx/room/AmbiguousColumnResolverTest.kt
index 403b226..2d8a5fb 100644
--- a/room/room-common/src/commonTest/kotlin/androidx/room/AmbiguousColumnResolverTest.kt
+++ b/room/room-common/src/commonTest/kotlin/androidx/room/AmbiguousColumnResolverTest.kt
@@ -1,3 +1,4 @@
+
 /*
  * Copyright 2021 The Android Open Source Project
  *
@@ -13,16 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.room
-
 import androidx.kruth.assertThat
-import java.util.Locale
-import org.junit.Ignore
-import org.junit.Test
+import kotlin.test.Ignore
+import kotlin.test.Test
 
 class AmbiguousColumnResolverTest {
-
     @Test
     fun simple() {
         // query: SELECT * FROM T1 JOIN T2
@@ -41,7 +38,6 @@
             )
         )
     }
-
     @Test
     fun simple_pojoSwapped() {
         // query: SELECT * FROM T1 JOIN T2
@@ -60,9 +56,8 @@
             )
         )
     }
-
     @Test
-    @Ignore("Algorithm can't solve this as expected.")
+    @Ignore // Algorithm can't solve this as expected.
     fun simple_oddResultOrder() {
         // query: SELECT User.id, Comment.id, userId, text, name FROM User JOIN Comment
         // return: Map<User, Comment>
@@ -84,7 +79,6 @@
             )
         )
     }
-
     @Test
     fun dupeColumnMigrated_one() {
         // Star projection query where 'A' (a dupe column) was added via migration
@@ -102,7 +96,6 @@
             )
         )
     }
-
     @Test
     fun dupeColumnMigrated_both() {
         // Star projection query where both dupe columns 'A' were added via migration
@@ -120,7 +113,6 @@
             )
         )
     }
-
     @Test
     fun multiple_duplicates() {
         // Mapping multiple dupe columns ('A' and 'C')
@@ -138,7 +130,6 @@
             )
         )
     }
-
     @Test
     fun multiple_duplicates_noUnique() {
         // Mapping multiple dupe columns and one of the tables have no unique column, i.e. in the
@@ -157,9 +148,8 @@
             )
         )
     }
-
     @Test
-    @Ignore("Algorithm can't solve this as expected.")
+    @Ignore // Algorithm can't solve this as expected.
     fun multiple_duplicates_noUnique_swapped() {
         // Mapping multiple dupe columns and one of the tables have no unique column, i.e. in the
         // result they are all dupes. However, the order of mappings given to the algorithm is
@@ -179,7 +169,6 @@
             )
         )
     }
-
     @Test
     fun extraResultColumns() {
         // Extra results columns are ignored
@@ -197,7 +186,6 @@
             )
         )
     }
-
     @Test
     fun extraResultColumns_withGap() {
         // Extra results columns, including causing gaps between POJO columns are ignored
@@ -215,7 +203,6 @@
             )
         )
     }
-
     @Test
     fun firstChoice() {
         // When resolving a single solo duplicate column, the algorithm will choose the first one
@@ -234,7 +221,6 @@
             )
         )
     }
-
     @Test
     fun firstChoice_resultOrderSwapped() {
         // Not what we want, but its likely that in practice either the columns will
@@ -253,7 +239,6 @@
             )
         )
     }
-
     @Test
     fun firstChoice_bothSolo() {
         // With the current information this is impossible to resolve, it'll be a first found
@@ -272,7 +257,6 @@
             )
         )
     }
-
     @Test
     fun dupesInMapping() {
         // This input shouldn't happen since a single POJO (even with embedded) is not allowed
@@ -291,7 +275,6 @@
             )
         )
     }
-
     @Test
     fun repeatedColumn() {
         // Both POJOs map the same result (non dupe) column
@@ -309,7 +292,6 @@
             )
         )
     }
-
     @Test
     fun repeatedColumn_firstChoice() {
         val result = AmbiguousColumnResolver.resolve(
@@ -326,7 +308,6 @@
             )
         )
     }
-
     @Test
     fun repeatedColumn_withDuplicate() {
         val result = AmbiguousColumnResolver.resolve(
@@ -343,7 +324,6 @@
             )
         )
     }
-
     @Test
     fun repeatedColumn_withDuplicate_pojoSwapped() {
         val result = AmbiguousColumnResolver.resolve(
@@ -360,9 +340,8 @@
             )
         )
     }
-
     @Test
-    @Ignore("Algorithm can't solve this as expected.")
+    @Ignore // Algorithm can't solve this as expected.
     fun repeatedColumn_withDuplicate_withGap() {
         // The algorithm finds two solutions but both have the same cost.
         val result = AmbiguousColumnResolver.resolve(
@@ -379,7 +358,6 @@
             )
         )
     }
-
     @Test
     fun case_insensitive() {
         val result = AmbiguousColumnResolver.resolve(
@@ -396,30 +374,6 @@
             )
         )
     }
-
-    @Test
-    fun case_insensitive_tr() {
-        val originalLocale = Locale.getDefault()
-        try {
-            Locale.setDefault(Locale("tr")) // Turkish has special upper/lowercase i chars
-            val result = AmbiguousColumnResolver.resolve(
-                arrayOf("i̇", "B", "İ", "C", "D"),
-                arrayOf(
-                    arrayOf("İ", "b"),
-                    arrayOf("i̇", "C", "d")
-                )
-            )
-            assertThat(result).isEqualTo(
-                arrayOf(
-                    intArrayOf(0, 1),
-                    intArrayOf(2, 3, 4),
-                )
-            )
-        } finally {
-            Locale.setDefault(originalLocale)
-        }
-    }
-
     @Test
     fun case_backticks() {
         val result = AmbiguousColumnResolver.resolve(
diff --git a/room/room-common/src/jvmTest/kotlin/androidx/room/AmbiguousColumnResolverTurkishLocaleTest.kt b/room/room-common/src/jvmTest/kotlin/androidx/room/AmbiguousColumnResolverTurkishLocaleTest.kt
new file mode 100644
index 0000000..a0bd1ec6
--- /dev/null
+++ b/room/room-common/src/jvmTest/kotlin/androidx/room/AmbiguousColumnResolverTurkishLocaleTest.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.room
+
+import androidx.kruth.assertThat
+import java.util.Locale
+import org.junit.Test
+
+class AmbiguousColumnResolverTurkishLocaleTest {
+    @Test
+    fun case_insensitive_tr() {
+        val originalLocale = Locale.getDefault()
+        try {
+            Locale.setDefault(Locale("tr")) // Turkish has special upper/lowercase i chars
+            val result = AmbiguousColumnResolver.resolve(
+                arrayOf("i̇", "B", "İ", "C", "D"),
+                arrayOf(
+                    arrayOf("İ", "b"),
+                    arrayOf("i̇", "C", "d")
+                )
+            )
+            assertThat(result).isEqualTo(
+                arrayOf(
+                    intArrayOf(0, 1),
+                    intArrayOf(2, 3, 4),
+                )
+            )
+        } finally {
+            Locale.setDefault(originalLocale)
+        }
+    }
+}
diff --git a/room/room-common/src/commonTest/kotlin/androidx/room/AnnotationRetentionPolicyTest.kt b/room/room-common/src/jvmTest/kotlin/androidx/room/AnnotationRetentionPolicyTest.kt
similarity index 100%
rename from room/room-common/src/commonTest/kotlin/androidx/room/AnnotationRetentionPolicyTest.kt
rename to room/room-common/src/jvmTest/kotlin/androidx/room/AnnotationRetentionPolicyTest.kt
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacElement.kt
index da08a2f..0cb2cff 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacElement.kt
@@ -22,7 +22,8 @@
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XEquality
 import androidx.room.compiler.processing.XHasModifiers
-import androidx.room.compiler.processing.javac.kotlin.KmFlags
+import androidx.room.compiler.processing.javac.kotlin.KmData
+import androidx.room.compiler.processing.javac.kotlin.KmVisibility
 import androidx.room.compiler.processing.unwrapRepeatedAnnotationsFromContainer
 import com.google.auto.common.MoreElements
 import com.google.auto.common.MoreElements.isAnnotationPresent
@@ -31,7 +32,6 @@
 import javax.lang.model.element.Element
 import javax.lang.model.element.Modifier
 import kotlin.reflect.KClass
-import kotlinx.metadata.Flag
 
 @Suppress("UnstableApiUsage")
 internal abstract class JavacElement(
@@ -39,7 +39,7 @@
     open val element: Element
 ) : XElement, XEquality, InternalXAnnotated, XHasModifiers {
 
-    abstract val kotlinMetadata: KmFlags?
+    abstract val kotlinMetadata: KmData?
 
     override fun <T : Annotation> getAnnotations(
         annotation: KClass<T>,
@@ -121,7 +121,7 @@
     }
 
     override fun isInternal(): Boolean {
-        return kotlinMetadata?.flags?.let { Flag.IS_INTERNAL(it) } ?: false
+        return (kotlinMetadata as? KmVisibility)?.isInternal() ?: false
     }
 
     override fun isProtected(): Boolean {
@@ -133,7 +133,7 @@
     }
 
     override fun isKtPrivate(): Boolean {
-        return kotlinMetadata?.flags?.let { Flag.IS_PRIVATE(it) } ?: false
+        return (kotlinMetadata as? KmVisibility)?.isPrivate() ?: false
     }
 
     override fun isPrivate(): Boolean {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
index 4151278..6808dc0 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
@@ -122,7 +122,7 @@
 
     override fun isJavaDefault() = element.modifiers.contains(Modifier.DEFAULT)
 
-    override fun isSuspendFunction() = kotlinMetadata?.isSuspend() == true
+    override fun isSuspendFunction() = kotlinMetadata?.isSuspend == true
 
     override fun isExtensionFunction() = kotlinMetadata?.isExtension() == true
 
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacPackageElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacPackageElement.kt
index 4519d9a..20e4931 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacPackageElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacPackageElement.kt
@@ -19,8 +19,7 @@
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XMemberContainer
 import androidx.room.compiler.processing.XPackageElement
-import androidx.room.compiler.processing.javac.kotlin.KmFlags
-import java.lang.UnsupportedOperationException
+import androidx.room.compiler.processing.javac.kotlin.KmVisibility
 import javax.lang.model.element.PackageElement
 
 internal class JavacPackageElement(
@@ -30,7 +29,7 @@
     override val qualifiedName: String by lazy {
         packageElement.qualifiedName.toString()
     }
-    override val kotlinMetadata: KmFlags?
+    override val kotlinMetadata: KmVisibility?
         get() = null
     override val name: String by lazy {
         packageElement.simpleName.toString()
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
index 0215dc4..8881463 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
@@ -29,8 +29,7 @@
 import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.VariableElement
 import javax.tools.Diagnostic
-import kotlinx.metadata.Flag
-import kotlinx.metadata.Flags
+import kotlinx.metadata.ClassKind
 import kotlinx.metadata.KmAnnotation
 import kotlinx.metadata.KmAnnotationArgument
 import kotlinx.metadata.KmClass
@@ -41,6 +40,16 @@
 import kotlinx.metadata.KmType
 import kotlinx.metadata.KmTypeParameter
 import kotlinx.metadata.KmValueParameter
+import kotlinx.metadata.Visibility
+import kotlinx.metadata.declaresDefaultValue
+import kotlinx.metadata.isData
+import kotlinx.metadata.isDelegated
+import kotlinx.metadata.isExpect
+import kotlinx.metadata.isFunInterface
+import kotlinx.metadata.isNullable
+import kotlinx.metadata.isSecondary
+import kotlinx.metadata.isSuspend
+import kotlinx.metadata.isValue
 import kotlinx.metadata.jvm.KotlinClassMetadata
 import kotlinx.metadata.jvm.annotations
 import kotlinx.metadata.jvm.fieldSignature
@@ -48,32 +57,37 @@
 import kotlinx.metadata.jvm.setterSignature
 import kotlinx.metadata.jvm.signature
 import kotlinx.metadata.jvm.syntheticMethodForAnnotations
+import kotlinx.metadata.kind
+import kotlinx.metadata.visibility
 
-internal interface KmFlags {
-    val flags: Flags
+internal interface KmData
+
+internal interface KmVisibility : KmData {
+    val visibility: Visibility
+    fun isInternal() = visibility == Visibility.INTERNAL
+    fun isPrivate() = visibility == Visibility.PRIVATE
 }
 
-internal interface KmBaseTypeContainer : KmFlags {
+internal interface KmBaseTypeContainer : KmData {
     val upperBounds: List<KmTypeContainer>
     val nullability: XNullability
-    fun isNullable() = Flag.Type.IS_NULLABLE(flags)
 }
 
 internal class KmClassContainer(
     private val env: JavacProcessingEnv,
     private val kmClass: KmClass
-) : KmFlags {
-    override val flags: Flags
-        get() = kmClass.flags
+) : KmVisibility {
+    override val visibility: Visibility
+        get() = kmClass.visibility
 
     val type: KmTypeContainer by lazy {
         KmTypeContainer(
-            kmType = KmType(flags).apply {
+            kmType = KmType().apply {
                 classifier = KmClassifier.Class(kmClass.name)
             },
             typeArguments = kmClass.typeParameters.map { kmTypeParameter ->
                 KmTypeContainer(
-                    kmType = KmType(kmTypeParameter.flags).apply {
+                    kmType = KmType().apply {
                         classifier = KmClassifier.Class(kmTypeParameter.name)
                     },
                     typeArguments = emptyList(),
@@ -111,15 +125,15 @@
         constructorList.firstOrNull { it.isPrimary() }?.descriptor
     }
 
-    fun isObject() = Flag.Class.IS_OBJECT(flags)
-    fun isCompanionObject() = Flag.Class.IS_COMPANION_OBJECT(flags)
-    fun isAnnotationClass() = Flag.Class.IS_ANNOTATION_CLASS(flags)
-    fun isClass() = Flag.Class.IS_CLASS(flags)
-    fun isInterface() = Flag.Class.IS_INTERFACE(flags)
-    fun isDataClass() = Flag.Class.IS_DATA(flags)
-    fun isValueClass() = Flag.Class.IS_VALUE(flags)
-    fun isFunctionalInterface() = Flag.Class.IS_FUN(flags)
-    fun isExpect() = Flag.Class.IS_EXPECT(flags)
+    fun isObject() = kmClass.kind == ClassKind.OBJECT
+    fun isCompanionObject() = kmClass.kind == ClassKind.COMPANION_OBJECT
+    fun isAnnotationClass() = kmClass.kind == ClassKind.ANNOTATION_CLASS
+    fun isClass() = kmClass.kind == ClassKind.CLASS
+    fun isInterface() = kmClass.kind == ClassKind.INTERFACE
+    fun isDataClass() = kmClass.isData
+    fun isValueClass() = kmClass.isValue
+    fun isFunctionalInterface() = kmClass.isFunInterface
+    fun isExpect() = kmClass.isExpect
 
     fun getFunctionMetadata(method: ExecutableElement): KmFunctionContainer? {
         check(method.kind == ElementKind.METHOD) {
@@ -167,16 +181,8 @@
          */
         fun createFor(env: JavacProcessingEnv, element: Element): KmClassContainer? {
             val metadataAnnotation = getMetadataAnnotation(element) ?: return null
-            val classMetadata = KotlinClassMetadata.read(metadataAnnotation)
-            if (classMetadata == null) {
-                env.delegate.messager.printMessage(
-                    Diagnostic.Kind.WARNING,
-                    "Unable to read Kotlin metadata due to unsupported metadata version.",
-                    element
-                )
-            }
-            return when (classMetadata) {
-                is KotlinClassMetadata.Class -> KmClassContainer(env, classMetadata.toKmClass())
+            return when (val classMetadata = KotlinClassMetadata.read(metadataAnnotation)) {
+                is KotlinClassMetadata.Class -> KmClassContainer(env, classMetadata.kmClass)
                 // Synthetic classes generated for various Kotlin features ($DefaultImpls,
                 // $WhenMappings, etc) are ignored because the data contained does not affect
                 // the metadata derived APIs. These classes are never referenced by user code but
@@ -214,7 +220,7 @@
     }
 }
 
-internal interface KmFunctionContainer : KmFlags {
+internal interface KmFunctionContainer : KmVisibility {
     /** Name of the function in source code */
     val name: String
     /** Name of the function in byte code */
@@ -224,13 +230,13 @@
     val parameters: List<KmValueParameterContainer>
     val returnType: KmTypeContainer
     val propertyName: String?
+    val isSuspend: Boolean
 
     fun isPropertySetter() = false
     fun isPropertyGetter() = false
     fun isSyntheticMethodForAnnotations() =
         (this as? KmPropertyFunctionContainerImpl)?.syntheticMethodForAnnotations == true
     fun isPropertyFunction() = this is KmPropertyFunctionContainerImpl
-    fun isSuspend() = Flag.Function.IS_SUSPEND(flags)
     fun isExtension() =
         (this as? KmFunctionContainerImpl)?.kmFunction?.receiverParameterType != null
 }
@@ -239,23 +245,25 @@
     val kmFunction: KmFunction,
     override val returnType: KmTypeContainer,
 ) : KmFunctionContainer {
-    override val flags: Flags
-        get() = kmFunction.flags
+    override val visibility: Visibility
+        get() = kmFunction.visibility
     override val name: String
         get() = kmFunction.name
     override val propertyName: String? = null
     override val jvmName: String
         get() = kmFunction.signature!!.name
     override val descriptor: String
-        get() = kmFunction.signature!!.asString()
+        get() = kmFunction.signature!!.toString()
     override val typeParameters: List<KmTypeParameterContainer>
         get() = kmFunction.typeParameters.map { it.asContainer() }
     override val parameters: List<KmValueParameterContainer>
         get() = kmFunction.valueParameters.map { it.asContainer() }
+    override val isSuspend: Boolean
+        get() = kmFunction.isSuspend
 }
 
 private open class KmPropertyFunctionContainerImpl(
-    override val flags: Flags,
+    override val visibility: Visibility,
     override val name: String,
     override val jvmName: String,
     override val descriptor: String,
@@ -267,6 +275,7 @@
     val syntheticMethodForAnnotations: Boolean = false
 ) : KmFunctionContainer {
     override val typeParameters: List<KmTypeParameterContainer> = emptyList()
+    override val isSuspend: Boolean = false
     override fun isPropertySetter() = isSetterMethod
     override fun isPropertyGetter() = isGetterMethod
 }
@@ -275,18 +284,20 @@
     private val kmConstructor: KmConstructor,
     override val returnType: KmTypeContainer,
 ) : KmFunctionContainer {
-    override val flags: Flags
-        get() = kmConstructor.flags
+    override val visibility: Visibility
+        get() = kmConstructor.visibility
     override val name: String = "<init>"
     override val propertyName: String? = null
     override val jvmName: String = name
     override val descriptor: String
-        get() = checkNotNull(kmConstructor.signature).asString()
+        get() = checkNotNull(kmConstructor.signature).toString()
     override val typeParameters: List<KmTypeParameterContainer> = emptyList()
     override val parameters: List<KmValueParameterContainer> by lazy {
         kmConstructor.valueParameters.map { it.asContainer() }
     }
-    fun isPrimary() = !Flag.Constructor.IS_SECONDARY(flags)
+    override val isSuspend: Boolean
+        get() = false
+    fun isPrimary() = !kmConstructor.isSecondary
 }
 
 internal class KmPropertyContainer(
@@ -296,15 +307,15 @@
     val getter: KmFunctionContainer?,
     val setter: KmFunctionContainer?,
     val syntheticMethodForAnnotations: KmFunctionContainer?,
-) : KmFlags {
-    override val flags: Flags
-        get() = kmProperty.flags
+) : KmVisibility {
+    override val visibility: Visibility
+        get() = kmProperty.visibility
     val name: String
         get() = kmProperty.name
     val typeParameters: List<KmTypeContainer>
         get() = type.typeArguments
     fun isNullable() = type.isNullable()
-    fun isDelegated() = Flag.Property.IS_DELEGATED(flags)
+    fun isDelegated() = kmProperty.isDelegated
 }
 
 internal class KmTypeContainer(
@@ -315,8 +326,7 @@
     /** The upper bounds are only non-empty for type variable types with upper bounds. */
     override val upperBounds: List<KmTypeContainer> = emptyList()
 ) : KmBaseTypeContainer {
-    override val flags: Flags
-        get() = kmType.flags
+    fun isNullable() = kmType.isNullable
 
     val className: String? = kmType.classifier.let {
         when (it) {
@@ -380,6 +390,14 @@
                 is KmAnnotationArgument.KClassValue -> {
                     env.requireType(it.className.replace('/', '.'))
                 }
+                is KmAnnotationArgument.ArrayKClassValue -> {
+                    val innerType = env.requireType(it.className.replace('/', '.'))
+                    var arrayType = env.getArrayType(innerType)
+                    repeat(it.arrayDimensionCount - 1) {
+                        arrayType = env.getArrayType(arrayType)
+                    }
+                    arrayType
+                }
             }
         }
     }
@@ -389,26 +407,22 @@
     private val kmTypeParameter: KmTypeParameter,
     override val upperBounds: List<KmTypeContainer>
 ) : KmBaseTypeContainer {
-    override val flags: Flags
-        get() = kmTypeParameter.flags
     val name: String
         get() = kmTypeParameter.name
 
     override val nullability: XNullability
-        get() = computeTypeNullability(this.isNullable(), this.upperBounds, null)
+        get() = computeTypeNullability(false, this.upperBounds, null)
 }
 
 internal class KmValueParameterContainer(
     private val kmValueParameter: KmValueParameter,
     val type: KmTypeContainer
-) : KmFlags {
-    override val flags: Flags
-        get() = kmValueParameter.flags
+) : KmData {
     val name: String
         get() = kmValueParameter.name
     fun isVarArgs() = kmValueParameter.varargElementType != null
     fun isNullable() = type.isNullable()
-    fun hasDefault() = Flag.ValueParameter.DECLARES_DEFAULT_VALUE(flags)
+    fun hasDefault() = kmValueParameter.declaresDefaultValue
 }
 
 private fun computeTypeNullability(
@@ -445,10 +459,10 @@
         backingFieldName = fieldSignature?.name,
         getter = getterSignature?.let {
             KmPropertyFunctionContainerImpl(
-                flags = this.getterFlags,
+                visibility = this.visibility,
                 name = JvmAbi.computeGetterName(this.name),
                 jvmName = it.name,
-                descriptor = it.asString(),
+                descriptor = it.toString(),
                 parameters = emptyList(),
                 returnType = this.returnType.asContainer(),
                 propertyName = this.name,
@@ -459,17 +473,16 @@
         setter = setterSignature?.let {
             // setter parameter visitor may not be available when not declared explicitly
             val param = this.setterParameter ?: KmValueParameter(
-                flags = 0,
                 // kotlinc will set this to set-? but it is better to not expose
                 // it here since it is not valid name
                 name = "set-?".sanitizeAsJavaParameterName(0)
             ).apply { type = [email protected] }
-            val returnType = KmType(0).apply { classifier = KmClassifier.Class("Unit") }
+            val returnType = KmType().apply { classifier = KmClassifier.Class("Unit") }
             KmPropertyFunctionContainerImpl(
-                flags = this.setterFlags,
+                visibility = this.visibility,
                 name = JvmAbi.computeSetterName(this.name),
                 jvmName = it.name,
-                descriptor = it.asString(),
+                descriptor = it.toString(),
                 parameters = listOf(param.asContainer()),
                 returnType = returnType.asContainer(),
                 propertyName = this.name,
@@ -478,12 +491,12 @@
             )
         },
         syntheticMethodForAnnotations = syntheticMethodForAnnotations?.let {
-            val returnType = KmType(0).apply { classifier = KmClassifier.Class("Unit") }
+            val returnType = KmType().apply { classifier = KmClassifier.Class("Unit") }
             KmPropertyFunctionContainerImpl(
-                flags = 0,
+                visibility = this.visibility,
                 name = JvmAbi.computeSyntheticMethodForAnnotationsName(this.name),
                 jvmName = it.name,
-                descriptor = it.asString(),
+                descriptor = it.toString(),
                 parameters = emptyList(),
                 returnType = returnType.asContainer(),
                 syntheticMethodForAnnotations = true,
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/DefaultKspType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/DefaultKspType.kt
index 5c1bbaf..521049c 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/DefaultKspType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/DefaultKspType.kt
@@ -31,9 +31,17 @@
 ) : KspType(env, ksType, originalKSAnnotations, scope, typeAlias) {
 
     override fun resolveJTypeName(): JTypeName {
-        // always box these. For primitives, typeName might return the primitive type but if we
-        // wanted it to be a primitive, we would've resolved it to [KspPrimitiveType].
-        return ksType.asJTypeName(env.resolver).tryBox()
+        // Always box these unless for inline value classes. For primitives, typeName might return
+        // the primitive type but if we wanted it to be a primitive, we would've resolved it to
+        // [KspPrimitiveType]. Inline value classes with primitive values won't be resolved to
+        // [KspPrimitiveType] because we need boxed name for Kotlin and unboxed name for Java.
+        return if (ksType.declaration.isValueClass()) {
+            // Don't box inline value classes, e.g. the type name for `UInt` should be `int`,
+            // not `Integer`, if used directly.
+            ksType.asJTypeName(env.resolver)
+        } else {
+            ksType.asJTypeName(env.resolver).tryBox()
+        }
     }
 
     override fun resolveKTypeName(): KTypeName {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeJavaPoetExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeJavaPoetExt.kt
index 44457bd..38c34d5 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeJavaPoetExt.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeJavaPoetExt.kt
@@ -21,7 +21,6 @@
 import androidx.room.compiler.processing.tryBox
 import androidx.room.compiler.processing.util.ISSUE_TRACKER_LINK
 import com.google.devtools.ksp.KspExperimental
-import com.google.devtools.ksp.isAnnotationPresent
 import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.symbol.KSDeclaration
 import com.google.devtools.ksp.symbol.KSName
@@ -30,7 +29,6 @@
 import com.google.devtools.ksp.symbol.KSTypeArgument
 import com.google.devtools.ksp.symbol.KSTypeParameter
 import com.google.devtools.ksp.symbol.KSTypeReference
-import com.google.devtools.ksp.symbol.Modifier
 import com.google.devtools.ksp.symbol.Variance
 import com.squareup.kotlinpoet.javapoet.JClassName
 import com.squareup.kotlinpoet.javapoet.JParameterizedTypeName
@@ -98,13 +96,14 @@
     val qualified = qualifiedName?.asString() ?: return ERROR_JTYPE_NAME
     val pkg = getNormalizedPackageName()
 
+    // We want to map Kotlin types to equivalent Java types if there is one (e.g.
+    // kotlin.String to java.lang.String or kotlin.collections.List to java.util.List).
     // Note: To match KAPT behavior, a type annotated with @JvmInline is only replaced with the
     // underlying type if the inline type is used directly (e.g. MyInlineType) rather than in the
     // type args of another type, (e.g. List<MyInlineType>).
-    val isInlineUsedDirectly =
-        (isAnnotationPresent(JvmInline::class) || modifiers.contains(Modifier.INLINE)) &&
-            typeResolutionContext.originalType?.declaration?.qualifiedName?.asString() == qualified
-    if (pkg == "kotlin" || pkg.startsWith("kotlin.") || isInlineUsedDirectly) {
+    val isInline = isValueClass()
+    val isKotlinType = pkg == "kotlin" || pkg.startsWith("kotlin.")
+    if ((isInline && isUsedDirectly(typeResolutionContext)) || (!isInline && isKotlinType)) {
         val jvmSignature = resolver.mapToJvmSignature(this)
         if (!jvmSignature.isNullOrBlank()) {
             return jvmSignature.typeNameFromJvmSignature()
@@ -180,9 +179,9 @@
     return if (declaration is KSTypeAlias) {
         replaceTypeAliases(resolver).asJTypeName(resolver, typeResolutionContext)
     } else if (this.arguments.isNotEmpty() && !resolver.isJavaRawType(this) &&
-            // Excluding generic value classes otherwise we may generate something
+            // Excluding generic value classes used directly otherwise we may generate something
             // like `Object<String>`.
-            !declaration.isValueClass()) {
+            !(declaration.isValueClass() && declaration.isUsedDirectly(typeResolutionContext))) {
         val args: Array<JTypeName> = this.arguments
             .map { typeArg -> typeArg.asJTypeName(resolver, typeResolutionContext) }
             .map { it.tryBox() }
@@ -234,3 +233,8 @@
     name,
     bounds
 ) as JTypeVariableName
+
+private fun KSDeclaration.isUsedDirectly(typeResolutionContext: TypeResolutionContext): Boolean {
+    val qualified = qualifiedName?.asString()
+    return typeResolutionContext.originalType?.declaration?.qualifiedName?.asString() == qualified
+}
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
index af27478..0f01914 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
@@ -1848,16 +1848,7 @@
             "KotlinClass.kt",
             """
             @JvmInline value class PackageName(val value: String)
-            @JvmInline value class MyResult<T>(val value: T)
-
             class KotlinClass {
-                // @JvmName disables name mangling for functions that use inline classes and
-                // make them visible to Java:
-                // https://kotlinlang.org/docs/inline-classes.html#calling-from-java-code
-                @JvmName("getResult")
-                fun getResult(): MyResult<String> = TODO()
-                @JvmName("setResult")
-                fun setResult(result: MyResult<String>) { }
                 fun getPackageNames(): Set<PackageName> = emptySet()
                 fun setPackageNames(pkgNames: Set<PackageName>) { }
             }
@@ -1869,31 +1860,6 @@
         ) { invocation ->
             val kotlinElm = invocation.processingEnv.requireTypeElement("KotlinClass")
 
-            kotlinElm.getDeclaredMethodByJvmName("getResult").apply {
-                assertThat(returnType.asTypeName().java.toString())
-                    .isEqualTo("java.lang.Object")
-                if (invocation.isKsp) {
-                    assertThat(returnType.asTypeName().kotlin.toString())
-                        .isEqualTo("MyResult<kotlin.String>")
-                } else {
-                    // Can't generate Kotlin code with KAPT
-                    assertThat(returnType.asTypeName().kotlin.toString())
-                        .isEqualTo("androidx.room.compiler.codegen.Unavailable")
-                }
-            }
-            kotlinElm.getDeclaredMethodByJvmName("setResult").apply {
-                assertThat(parameters.single().type.asTypeName().java.toString())
-                    .isEqualTo("java.lang.Object")
-                if (invocation.isKsp) {
-                    assertThat(parameters.single().type.asTypeName().kotlin.toString())
-                        .isEqualTo("MyResult<kotlin.String>")
-                } else {
-                    // Can't generate Kotlin code with KAPT
-                    assertThat(parameters.single().type.asTypeName().kotlin.toString())
-                        .isEqualTo("androidx.room.compiler.codegen.Unavailable")
-                }
-            }
-
             kotlinElm.getMethodByJvmName("getPackageNames").apply {
                 assertThat(returnType.typeName.toString())
                     .isEqualTo("java.util.Set<PackageName>")
@@ -1909,4 +1875,120 @@
             }
         }
     }
+
+    @Test
+    fun jvmTypes(@TestParameter isPrecompiled: Boolean) {
+        val kotlinSrc = Source.kotlin(
+            "KotlinClass.kt",
+            """
+            @JvmInline value class MyInlineClass(val value: Int)
+            @JvmInline value class MyGenericInlineClass<T: Number>(val value: T)
+            class KotlinClass {
+                // @JvmName disables name mangling for functions that use inline classes directly
+                // and make them visible to Java:
+                // https://kotlinlang.org/docs/inline-classes.html#calling-from-java-code
+                @JvmName("kotlinValueClassDirectUsage")
+                fun kotlinValueClassDirectUsage(): UInt = TODO()
+                fun kotlinValueClassIndirectUsage(): List<UInt> = TODO()
+                fun kotlinNonValueClassDirectUsage(): String = TODO()
+                fun kotlinNonValueClassIndirectUsage(): List<String> = TODO()
+                @JvmName("kotlinGenericValueClassDirectUsage")
+                fun kotlinGenericValueClassDirectUsage(): Result<Int> = TODO()
+                fun kotlinGenericValueClassIndirectUsage(): List<Result<Int>> = TODO()
+                @JvmName("nonKotlinValueClassDirectUsage")
+                fun nonKotlinValueClassDirectUsage(): MyInlineClass = TODO()
+                fun nonKotlinValueClassIndirectUsage(): List<MyInlineClass> = TODO()
+                @JvmName("nonKotlinGenericValueClassDirectUsage")
+                fun nonKotlinGenericValueClassDirectUsage(): MyGenericInlineClass<Int> = TODO()
+                fun nonKotlinGenericValueClassIndirectUsage(): List<MyGenericInlineClass<Int>> = TODO()
+            }
+            """.trimIndent()
+        )
+        runProcessorTest(
+            sources = if (isPrecompiled) { emptyList() } else { listOf(kotlinSrc) },
+            classpath = if (isPrecompiled) { compileFiles(listOf(kotlinSrc)) } else { emptyList() }
+        ) { invocation ->
+            val kotlinElm = invocation.processingEnv.requireTypeElement("KotlinClass")
+            kotlinElm.getMethodByJvmName("kotlinValueClassDirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("int")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("kotlin.UInt")
+                }
+            }
+            kotlinElm.getMethodByJvmName("kotlinValueClassIndirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("java.util.List<kotlin.UInt>")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("kotlin.collections.List<kotlin.UInt>")
+                }
+            }
+            kotlinElm.getMethodByJvmName("kotlinNonValueClassDirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("java.lang.String")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("kotlin.String")
+                }
+            }
+            kotlinElm.getMethodByJvmName("kotlinNonValueClassIndirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("java.util.List<java.lang.String>")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("kotlin.collections.List<kotlin.String>")
+                }
+            }
+            kotlinElm.getMethodByJvmName("kotlinGenericValueClassDirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("java.lang.Object")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("kotlin.Result<kotlin.Int>")
+                }
+            }
+            kotlinElm.getMethodByJvmName("kotlinGenericValueClassIndirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("java.util.List<kotlin.Result<java.lang.Integer>>")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("kotlin.collections.List<kotlin.Result<kotlin.Int>>")
+                }
+            }
+            kotlinElm.getMethodByJvmName("nonKotlinValueClassDirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("int")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("MyInlineClass")
+                }
+            }
+            kotlinElm.getMethodByJvmName("nonKotlinValueClassIndirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("java.util.List<MyInlineClass>")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("kotlin.collections.List<MyInlineClass>")
+                }
+            }
+            kotlinElm.getMethodByJvmName("nonKotlinGenericValueClassDirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("java.lang.Number")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("MyGenericInlineClass<kotlin.Int>")
+                }
+            }
+            kotlinElm.getMethodByJvmName("nonKotlinGenericValueClassIndirectUsage").apply {
+                assertThat(returnType.asTypeName().java.toString())
+                    .isEqualTo("java.util.List<MyGenericInlineClass<java.lang.Integer>>")
+                if (invocation.isKsp) {
+                    assertThat(returnType.asTypeName().kotlin.toString())
+                        .isEqualTo("kotlin.collections.List<MyGenericInlineClass<kotlin.Int>>")
+                }
+            }
+        }
+    }
 }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElementTest.kt
index 0e97e4a..53da68a 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElementTest.kt
@@ -197,7 +197,7 @@
             assertThat(
                 testClassElement.getDeclaredMethods().map {
                     it.simpleName.toString() to metadataElement.getFunctionMetadata(it)
-                        ?.isSuspend()
+                        ?.isSuspend
                 }
             ).containsExactly(
                 "emptyFunction" to false,
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt b/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
index e79616a..fda482f 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/ext/xpoet_ext.kt
@@ -317,6 +317,10 @@
         "null"
     } else if (this == XTypeName.PRIMITIVE_BOOLEAN) {
         "false"
+    } else if (this == XTypeName.PRIMITIVE_DOUBLE) {
+        "0.0"
+    } else if (this == XTypeName.PRIMITIVE_FLOAT) {
+        "0f"
     } else {
         "0"
     }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoKotlinCodeGenTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoKotlinCodeGenTest.kt
index 8a9f49f..0950112 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoKotlinCodeGenTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoKotlinCodeGenTest.kt
@@ -942,6 +942,8 @@
             data class MyEntity(
                 @PrimaryKey
                 val pk: Long,
+                val doubleColumn: Double,
+                val floatColumn: Float,
             )
             """.trimIndent()
         )
diff --git a/room/room-compiler/src/test/test-data/kotlinCodeGen/rawQuery.kt b/room/room-compiler/src/test/test-data/kotlinCodeGen/rawQuery.kt
index 2361e59..4472909 100644
--- a/room/room-compiler/src/test/test-data/kotlinCodeGen/rawQuery.kt
+++ b/room/room-compiler/src/test/test-data/kotlinCodeGen/rawQuery.kt
@@ -5,6 +5,8 @@
 import androidx.sqlite.db.SupportSQLiteQuery
 import java.lang.Class
 import javax.`annotation`.processing.Generated
+import kotlin.Double
+import kotlin.Float
 import kotlin.Int
 import kotlin.Long
 import kotlin.Suppress
@@ -40,13 +42,27 @@
     private fun __entityCursorConverter_MyEntity(cursor: Cursor): MyEntity {
         val _entity: MyEntity
         val _cursorIndexOfPk: Int = getColumnIndex(cursor, "pk")
+        val _cursorIndexOfDoubleColumn: Int = getColumnIndex(cursor, "doubleColumn")
+        val _cursorIndexOfFloatColumn: Int = getColumnIndex(cursor, "floatColumn")
         val _tmpPk: Long
         if (_cursorIndexOfPk == -1) {
             _tmpPk = 0
         } else {
             _tmpPk = cursor.getLong(_cursorIndexOfPk)
         }
-        _entity = MyEntity(_tmpPk)
+        val _tmpDoubleColumn: Double
+        if (_cursorIndexOfDoubleColumn == -1) {
+            _tmpDoubleColumn = 0.0
+        } else {
+            _tmpDoubleColumn = cursor.getDouble(_cursorIndexOfDoubleColumn)
+        }
+        val _tmpFloatColumn: Float
+        if (_cursorIndexOfFloatColumn == -1) {
+            _tmpFloatColumn = 0f
+        } else {
+            _tmpFloatColumn = cursor.getFloat(_cursorIndexOfFloatColumn)
+        }
+        _entity = MyEntity(_tmpPk,_tmpDoubleColumn,_tmpFloatColumn)
         return _entity
     }
 
diff --git a/room/room-guava/lint-baseline.xml b/room/room-guava/lint-baseline.xml
index 4e529ae..5dc0618b 100644
--- a/room/room-guava/lint-baseline.xml
+++ b/room/room-guava/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="RestrictedApiAndroidX"
@@ -20,6 +20,15 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (cancellationSignal != null &amp;&amp; Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/guava/GuavaRoom.java"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public static &lt;T> ListenableFuture&lt;T> createListenableFuture("
diff --git a/room/room-ktx/lint-baseline.xml b/room/room-ktx/lint-baseline.xml
index 99873f6..56671f7 100644
--- a/room/room-ktx/lint-baseline.xml
+++ b/room/room-ktx/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="RestrictedApiAndroidX"
@@ -37,4 +37,22 @@
             file="src/main/java/androidx/room/CoroutinesRoom.kt"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/CoroutinesRoom.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/CoroutinesRoom.kt"/>
+    </issue>
+
 </issues>
diff --git a/room/room-paging/src/androidTest/kotlin/androidx/room/paging/LimitOffsetPagingSourceTest.kt b/room/room-paging/src/androidTest/kotlin/androidx/room/paging/LimitOffsetPagingSourceTest.kt
index f818b98..739624f 100644
--- a/room/room-paging/src/androidTest/kotlin/androidx/room/paging/LimitOffsetPagingSourceTest.kt
+++ b/room/room-paging/src/androidTest/kotlin/androidx/room/paging/LimitOffsetPagingSourceTest.kt
@@ -36,7 +36,6 @@
 import androidx.testutils.TestExecutor
 import java.util.concurrent.Executors
 import java.util.concurrent.TimeUnit
-import kotlin.test.assertFailsWith
 import kotlin.test.assertFalse
 import kotlin.test.assertTrue
 import kotlinx.coroutines.Dispatchers
@@ -315,6 +314,21 @@
     }
 
     @Test
+    fun load_invalidQuery() = runPagingSourceTest(
+        LimitOffsetPagingSourceImpl(
+            db = database,
+            queryString = "SELECT * FROM $tableName ORDER BY",
+        )
+    ) { pager, _ ->
+        dao.addAllItems(ITEMS_LIST)
+        val result = pager.refresh()
+
+        assertThat(result).isInstanceOf<LoadResult.Error<Int, Int>>()
+        val throwable = (result as LoadResult.Error).throwable
+        assertThat(throwable).isNotNull()
+    }
+
+    @Test
     fun invalidInitialKey_dbEmpty_returnsEmpty() = runPagingSourceTest { pager, _ ->
         assertThat(
             (pager.refresh(initialKey = 101) as LoadResult.Page).data
@@ -337,12 +351,12 @@
     @Test
     fun invalidInitialKey_negativeKey() = runPagingSourceTest { pager, _ ->
         dao.addAllItems(ITEMS_LIST)
-        // should throw error when initial key is negative
-        val expectedException = assertFailsWith<IllegalArgumentException> {
-            pager.refresh(initialKey = -1)
-        }
+        // should return error when initial key is negative
+        val result = pager.refresh(initialKey = -1)
+        assertThat(result).isInstanceOf<LoadResult.Error<Int, Int>>()
+        val message = (result as LoadResult.Error).throwable.message
         // default message from Paging 3 for negative initial key
-        assertThat(expectedException.message).isEqualTo(
+        assertThat(message).isEqualTo(
             "itemsBefore cannot be negative"
         )
     }
diff --git a/room/room-paging/src/main/java/androidx/room/paging/LimitOffsetPagingSource.kt b/room/room-paging/src/main/java/androidx/room/paging/LimitOffsetPagingSource.kt
index bca76d1..eae82a6 100644
--- a/room/room-paging/src/main/java/androidx/room/paging/LimitOffsetPagingSource.kt
+++ b/room/room-paging/src/main/java/androidx/room/paging/LimitOffsetPagingSource.kt
@@ -71,10 +71,14 @@
             observer.registerIfNecessary(db)
             val tempCount = itemCount.get()
             // if itemCount is < 0, then it is initial load
-            if (tempCount == INITIAL_ITEM_COUNT) {
-                initialLoad(params)
-            } else {
-                nonInitialLoad(params, tempCount)
+            try {
+                if (tempCount == INITIAL_ITEM_COUNT) {
+                    initialLoad(params)
+                } else {
+                    nonInitialLoad(params, tempCount)
+                }
+            } catch (e: Exception) {
+                LoadResult.Error(e)
             }
         }
     }
diff --git a/room/room-runtime/api/api_lint.ignore b/room/room-runtime/api/api_lint.ignore
index ae12646..d11ad55 100644
--- a/room/room-runtime/api/api_lint.ignore
+++ b/room/room-runtime/api/api_lint.ignore
@@ -49,6 +49,10 @@
     T does not declare a `getJournalMode()` method matching method androidx.room.RoomDatabase.Builder.setJournalMode(androidx.room.RoomDatabase.JournalMode)
 
 
+NotCloseable: androidx.room.RoomDatabase:
+    Classes that release resources (close()) should implement AutoCloseable and CloseGuard: class androidx.room.RoomDatabase
+
+
 NullableCollection: androidx.room.DatabaseConfiguration#callbacks:
     Type of field androidx.room.DatabaseConfiguration.callbacks is a nullable collection (`java.util.List`); must be non-null
 NullableCollection: androidx.room.RoomDatabase.MigrationContainer#findMigrationPath(int, int):
diff --git a/room/room-runtime/lint-baseline.xml b/room/room-runtime/lint-baseline.xml
index 5b31a9b..d9c8463 100644
--- a/room/room-runtime/lint-baseline.xml
+++ b/room/room-runtime/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="Call requires API level 21 (current min is 14): `java.util.Locale#forLanguageTag`"
+        message="Call requires API level 21 (current min is 19): `java.util.Locale#forLanguageTag`"
         errorLine1="        Locale.setDefault(Locale.forLanguageTag(&quot;tr-TR&quot;))"
         errorLine2="                                 ~~~~~~~~~~~~~~">
         <location
@@ -424,4 +424,139 @@
             file="src/main/java/androidx/room/SQLiteCopyOpenHelper.kt"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="        @get:RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        @RequiresApi(api = Build.VERSION_CODES.KITKAT)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/util/CursorUtil.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/util/DBUtil.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN &amp;&amp;"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/InvalidationTracker.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        val wal = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/RoomDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        return if (signal != null &amp;&amp; Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/RoomDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        return if (signal != null &amp;&amp; Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/RoomDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN &amp;&amp;"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/RoomDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/RoomDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/RoomDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/SQLiteCopyOpenHelper.kt"/>
+    </issue>
+
 </issues>
diff --git a/room/room-testing/api/api_lint.ignore b/room/room-testing/api/api_lint.ignore
deleted file mode 100644
index 8ba24dc..0000000
--- a/room/room-testing/api/api_lint.ignore
+++ /dev/null
@@ -1,19 +0,0 @@
-// Baseline format: 1.0
-MissingNullability: androidx.room.testing.MigrationTestHelper#closeWhenFinished(androidx.room.RoomDatabase) parameter #0:
-    Missing nullability on parameter `db` in method `closeWhenFinished`
-MissingNullability: androidx.room.testing.MigrationTestHelper#closeWhenFinished(androidx.sqlite.db.SupportSQLiteDatabase) parameter #0:
-    Missing nullability on parameter `db` in method `closeWhenFinished`
-MissingNullability: androidx.room.testing.MigrationTestHelper#createDatabase(String, int):
-    Missing nullability on method `createDatabase` return
-MissingNullability: androidx.room.testing.MigrationTestHelper#createDatabase(String, int) parameter #0:
-    Missing nullability on parameter `name` in method `createDatabase`
-MissingNullability: androidx.room.testing.MigrationTestHelper#finished(org.junit.runner.Description) parameter #0:
-    Missing nullability on parameter `description` in method `finished`
-MissingNullability: androidx.room.testing.MigrationTestHelper#runMigrationsAndValidate(String, int, boolean, androidx.room.migration.Migration...):
-    Missing nullability on method `runMigrationsAndValidate` return
-MissingNullability: androidx.room.testing.MigrationTestHelper#runMigrationsAndValidate(String, int, boolean, androidx.room.migration.Migration...) parameter #0:
-    Missing nullability on parameter `name` in method `runMigrationsAndValidate`
-MissingNullability: androidx.room.testing.MigrationTestHelper#runMigrationsAndValidate(String, int, boolean, androidx.room.migration.Migration...) parameter #3:
-    Missing nullability on parameter `migrations` in method `runMigrationsAndValidate`
-MissingNullability: androidx.room.testing.MigrationTestHelper#starting(org.junit.runner.Description) parameter #0:
-    Missing nullability on parameter `description` in method `starting`
diff --git a/samples/AndroidXDemos/lint-baseline.xml b/samples/AndroidXDemos/lint-baseline.xml
index d52b634..aae5073 100644
--- a/samples/AndroidXDemos/lint-baseline.xml
+++ b/samples/AndroidXDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="OnClick"
@@ -51,7 +51,7 @@
 
     <issue
         id="NewApi"
-        message="Call requires API level 29 (current min is 14): `android.os.StrictMode.VmPolicy.Builder#detectImplicitDirectBoot`"
+        message="Call requires API level 29 (current min is 19): `android.os.StrictMode.VmPolicy.Builder#detectImplicitDirectBoot`"
         errorLine1="                        .detectImplicitDirectBoot()"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -60,142 +60,7 @@
 
     <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/androidx/app/AppCompatLocalNightModeActivity.java"/>
-    </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/androidx/app/AppCompatLocalNightModeActivity.java"/>
-    </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/androidx/app/AppCompatLocalNightModeActivity.java"/>
-    </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/androidx/app/AppCompatLocalNightModeActivity.java"/>
-    </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/androidx/app/AppCompatLocalNightModeActivity.java"/>
-    </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/androidx/app/AppCompatNightModeAlertDialog.java"/>
-    </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/androidx/app/AppCompatNightModeAlertDialog.java"/>
-    </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/androidx/app/AppCompatNightModeAlertDialog.java"/>
-    </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/androidx/app/AppCompatNightModeAlertDialog.java"/>
-    </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/androidx/app/AppCompatNightModeAlertDialog.java"/>
-    </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/androidx/app/AppCompatNightModeDialog.java"/>
-    </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/androidx/app/AppCompatNightModeDialog.java"/>
-    </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/androidx/app/AppCompatNightModeDialog.java"/>
-    </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/androidx/app/AppCompatNightModeDialog.java"/>
-    </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/androidx/app/AppCompatNightModeDialog.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="`&lt;class>` requires API level 24 (current min is 14)"
+        message="`&lt;class>` requires API level 24 (current min is 19)"
         errorLine1="    class=&quot;com.example.androidx.drawable.MyDrawable&quot;"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -348,12 +213,28 @@
 
     <issue
         id="ObsoleteSdkInt"
-        message="This folder configuration (`v11`) is unnecessary; `minSdkVersion` is 14. Merge all the resources in this folder into `layout`.">
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (SDK_INT >= 16) {"
+        errorLine2="                    ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/view/SystemUIModes.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v11`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `layout`.">
         <location
             file="src/main/res/layout-v11"/>
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v18`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
+        <location
+            file="src/main/res/values-v18"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
diff --git a/samples/MediaRoutingDemo/lint-baseline.xml b/samples/MediaRoutingDemo/lint-baseline.xml
index 96b93f7..7030d15 100644
--- a/samples/MediaRoutingDemo/lint-baseline.xml
+++ b/samples/MediaRoutingDemo/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-beta01" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-beta01)" variant="all" version="8.2.0-beta01">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="RestrictedApiAndroidX"
@@ -127,4 +127,173 @@
             file="src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="        @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="        @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="        @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1;"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/player/Player.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (route != null &amp;&amp; Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/player/Player.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v18`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
+        <location
+            file="src/main/res/values-v18"/>
+    </issue>
+
 </issues>
diff --git a/samples/Support4Demos/lint-baseline.xml b/samples/Support4Demos/lint-baseline.xml
index 8d63c2f..76a73d5 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="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="MissingPermission"
@@ -138,15 +138,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class com.example.android.supportv4.widget.SlidingPaneLayoutActivity.FirstLayoutListener is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mSlidingLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class com.example.android.supportv4.view.WindowInsetsPlayground is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getWindow().setStatusBarColor(0x80000000);"
         errorLine2="                        ~~~~~~~~~~~~~~~~~">
@@ -210,7 +201,16 @@
 
     <issue
         id="ObsoleteSdkInt"
-        message="This folder configuration (`v11`) is unnecessary; `minSdkVersion` is 14. Merge all the resources in this folder into `values`.">
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="This folder configuration (`v11`) is unnecessary; `minSdkVersion` is 19. Merge all the resources in this folder into `values`.">
         <location
             file="src/main/res/values-v11"/>
     </issue>
diff --git a/settings.gradle b/settings.gradle
index 9c56c24..edb7537 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -864,7 +864,7 @@
 includeProject(":room:integration-tests:room-testapp-kotlin", "room/integration-tests/kotlintestapp", [BuildType.MAIN])
 includeProject(":room:integration-tests:room-testapp-noappcompat", "room/integration-tests/noappcompattestapp", [BuildType.MAIN])
 includeProject(":room:room-benchmark", "room/benchmark", [BuildType.MAIN])
-includeProject(":room:room-common", [BuildType.MAIN, BuildType.COMPOSE, BuildType.KMP])
+includeProject(":room:room-common", [BuildType.MAIN, BuildType.COMPOSE, BuildType.KMP, BuildType.INFRAROGUE])
 includeProject(":room:room-compiler", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":room:room-compiler-processing", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN])
 includeProject(":room:room-compiler-processing-testing", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN])
diff --git a/sharetarget/sharetarget/lint-baseline.xml b/sharetarget/sharetarget/lint-baseline.xml
index 7e05b5c..af0b6b0 100644
--- a/sharetarget/sharetarget/lint-baseline.xml
+++ b/sharetarget/sharetarget/lint-baseline.xml
@@ -1,5 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sharetarget/ShortcutInfoCompatSaverImpl.java"/>
+    </issue>
 
     <issue
         id="UnknownNullness"
diff --git a/slice/slice-builders-ktx/api/api_lint.ignore b/slice/slice-builders-ktx/api/api_lint.ignore
deleted file mode 100644
index a13b245..0000000
--- a/slice/slice-builders-ktx/api/api_lint.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-KotlinDefaultParameterOrder: androidx.slice.builders.ListBuilderKt#tapSliceAction(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat, int, CharSequence) parameter #2:
-    Parameter `imageMode` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
-KotlinDefaultParameterOrder: androidx.slice.builders.ListBuilderKt#toggleSliceAction(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat, CharSequence, boolean) parameter #1:
-    Parameter `icon` has a default value and should come after all parameters without default values (except for a trailing lambda parameter)
diff --git a/slice/slice-builders/api/api_lint.ignore b/slice/slice-builders/api/api_lint.ignore
index 2e064a2..6c77427 100644
--- a/slice/slice-builders/api/api_lint.ignore
+++ b/slice/slice-builders/api/api_lint.ignore
@@ -41,22 +41,6 @@
     Listeners should always be at end of argument list (method `createToggle`)
 
 
-MissingBuildMethod: androidx.slice.builders.GridRowBuilder:
-    androidx.slice.builders.GridRowBuilder does not declare a `build()` method, but builder classes are expected to
-MissingBuildMethod: androidx.slice.builders.GridRowBuilder.CellBuilder:
-    androidx.slice.builders.GridRowBuilder.CellBuilder does not declare a `build()` method, but builder classes are expected to
-MissingBuildMethod: androidx.slice.builders.ListBuilder.HeaderBuilder:
-    androidx.slice.builders.ListBuilder.HeaderBuilder does not declare a `build()` method, but builder classes are expected to
-MissingBuildMethod: androidx.slice.builders.ListBuilder.InputRangeBuilder:
-    androidx.slice.builders.ListBuilder.InputRangeBuilder does not declare a `build()` method, but builder classes are expected to
-MissingBuildMethod: androidx.slice.builders.ListBuilder.RangeBuilder:
-    androidx.slice.builders.ListBuilder.RangeBuilder does not declare a `build()` method, but builder classes are expected to
-MissingBuildMethod: androidx.slice.builders.ListBuilder.RowBuilder:
-    androidx.slice.builders.ListBuilder.RowBuilder does not declare a `build()` method, but builder classes are expected to
-MissingBuildMethod: androidx.slice.builders.SelectionBuilder:
-    androidx.slice.builders.SelectionBuilder does not declare a `build()` method, but builder classes are expected to
-
-
 MissingNullability: androidx.slice.builders.SelectionBuilder#addOption(String, CharSequence):
     Missing nullability on method `addOption` return
 MissingNullability: androidx.slice.builders.SelectionBuilder#addOption(String, CharSequence) parameter #0:
@@ -97,29 +81,3 @@
     Missing nullability on method `createToggle` return
 MissingNullability: androidx.slice.builders.SliceAction#createToggle(androidx.remotecallback.RemoteCallback, androidx.core.graphics.drawable.IconCompat, CharSequence, boolean):
     Missing nullability on method `createToggle` return
-
-
-StaticFinalBuilder: androidx.slice.builders.GridRowBuilder:
-    Builder must be final: androidx.slice.builders.GridRowBuilder
-StaticFinalBuilder: androidx.slice.builders.GridRowBuilder.CellBuilder:
-    Builder must be final: androidx.slice.builders.GridRowBuilder.CellBuilder
-StaticFinalBuilder: androidx.slice.builders.ListBuilder.HeaderBuilder:
-    Builder must be final: androidx.slice.builders.ListBuilder.HeaderBuilder
-StaticFinalBuilder: androidx.slice.builders.ListBuilder.InputRangeBuilder:
-    Builder must be final: androidx.slice.builders.ListBuilder.InputRangeBuilder
-StaticFinalBuilder: androidx.slice.builders.ListBuilder.RangeBuilder:
-    Builder must be final: androidx.slice.builders.ListBuilder.RangeBuilder
-StaticFinalBuilder: androidx.slice.builders.ListBuilder.RowBuilder:
-    Builder must be final: androidx.slice.builders.ListBuilder.RowBuilder
-StaticFinalBuilder: androidx.slice.builders.SelectionBuilder:
-    Builder must be final: androidx.slice.builders.SelectionBuilder
-StaticFinalBuilder: androidx.slice.builders.TemplateSliceBuilder:
-    Builder must be final: androidx.slice.builders.TemplateSliceBuilder
-
-
-TopLevelBuilder: androidx.slice.builders.GridRowBuilder:
-    Builder should be defined as inner class: androidx.slice.builders.GridRowBuilder
-TopLevelBuilder: androidx.slice.builders.SelectionBuilder:
-    Builder should be defined as inner class: androidx.slice.builders.SelectionBuilder
-TopLevelBuilder: androidx.slice.builders.TemplateSliceBuilder:
-    Builder should be defined as inner class: androidx.slice.builders.TemplateSliceBuilder
diff --git a/slice/slice-builders/lint-baseline.xml b/slice/slice-builders/lint-baseline.xml
index 3679718..b323b06 100644
--- a/slice/slice-builders/lint-baseline.xml
+++ b/slice/slice-builders/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="WrongConstant"
@@ -28,4 +28,166 @@
             file="src/main/java/androidx/slice/builders/impl/ListBuilderImpl.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/GridRowBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/GridRowBuilderListV1Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/ListBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/ListBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/ListBuilderBasicImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/ListBuilderImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/MessagingBasicImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/MessagingBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/MessagingListV1Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/MessagingSliceBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/MessagingV1Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/SelectionBuilder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/SelectionBuilderBasicImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/SelectionBuilderImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/SelectionBuilderListV2Impl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/SliceAction.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/impl/TemplateBuilderImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/builders/TemplateSliceBuilder.java"/>
+    </issue>
+
 </issues>
diff --git a/slice/slice-core/lint-baseline.xml b/slice/slice-core/lint-baseline.xml
index 4b5f8f1..5c15d65 100644
--- a/slice/slice-core/lint-baseline.xml
+++ b/slice/slice-core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanUncheckedReflection"
@@ -10,4 +10,382 @@
             file="src/main/java/androidx/slice/SliceManagerWrapper.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/ArrayUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/Clock.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/compat/CompatPermissionManager.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/compat/CompatPinnedList.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/Slice.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/core/SliceAction.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/core/SliceActionImpl.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/core/SliceHints.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceItem.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceItemHolder.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceManager.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/compat/SlicePermissionActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19) return false;"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19) return null;"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is never &lt; 19"
+        errorLine1="        if (Build.VERSION.SDK_INT &lt; 19 || Build.VERSION.SDK_INT >= 28) return null;"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/compat/SliceProviderCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/core/SliceQuery.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceSpec.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceSpecs.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SystemClock.java"/>
+    </issue>
+
 </issues>
diff --git a/slice/slice-test/lint-baseline.xml b/slice/slice-test/lint-baseline.xml
index 9003689..78e8941 100644
--- a/slice/slice-test/lint-baseline.xml
+++ b/slice/slice-test/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.1.0-beta02" type="baseline" client="gradle" dependencies="false" name="AGP (8.1.0-beta02)" variant="all" version="8.1.0-beta02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="UnspecifiedImmutableFlag"
@@ -11,6 +11,24 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/test/SampleSliceProvider.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/test/SliceBroadcastReceiver.java"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public static Uri getUri(String path, Context context) {"
diff --git a/slice/slice-view/lint-baseline.xml b/slice/slice-view/lint-baseline.xml
index 688d705..bf96be3 100644
--- a/slice/slice-view/lint-baseline.xml
+++ b/slice/slice-view/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="cli" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanSynchronizedMethods"
@@ -30,15 +30,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            view.performAccessibilityAction(ACTION_ACCESSIBILITY_FOCUS, null);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/LocationBasedViewTracker.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.slice.widget.LocationBasedViewTracker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (child.isAccessibilityFocused()) {"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~">
@@ -73,4 +64,256 @@
             file="src/main/java/androidx/slice/widget/TemplateView.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/ActionRow.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/EventInfo.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/GridContent.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/GridRowView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/ListContent.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/MessageView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/RowContent.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/RowStyle.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/RowView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/ShortcutView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceActionView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceAdapter.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceChildView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceContent.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceLiveData.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceMetadata.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceMetrics.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceStructure.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceStyle.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceView.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceViewManager.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceViewManagerBase.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceViewManagerCompat.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceViewPolicy.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/SliceViewUtil.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/SliceXml.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slice/widget/TemplateView.java"/>
+    </issue>
+
 </issues>
diff --git a/slidingpanelayout/slidingpanelayout/api/api_lint.ignore b/slidingpanelayout/slidingpanelayout/api/api_lint.ignore
index a288bd0..ff43af9 100644
--- a/slidingpanelayout/slidingpanelayout/api/api_lint.ignore
+++ b/slidingpanelayout/slidingpanelayout/api/api_lint.ignore
@@ -9,31 +9,5 @@
     Listeners should be an interface, or otherwise renamed Callback: SimplePanelSlideListener
 
 
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#checkLayoutParams(android.view.ViewGroup.LayoutParams) parameter #0:
-    Missing nullability on parameter `p` in method `checkLayoutParams`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `c` in method `draw`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#drawChild(android.graphics.Canvas, android.view.View, long) parameter #0:
-    Missing nullability on parameter `canvas` in method `drawChild`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#drawChild(android.graphics.Canvas, android.view.View, long) parameter #1:
-    Missing nullability on parameter `child` in method `drawChild`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#generateDefaultLayoutParams():
-    Missing nullability on method `generateDefaultLayoutParams` return
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#generateLayoutParams(android.util.AttributeSet):
-    Missing nullability on method `generateLayoutParams` return
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#generateLayoutParams(android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `attrs` in method `generateLayoutParams`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#generateLayoutParams(android.view.ViewGroup.LayoutParams):
-    Missing nullability on method `generateLayoutParams` return
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#generateLayoutParams(android.view.ViewGroup.LayoutParams) parameter #0:
-    Missing nullability on parameter `p` in method `generateLayoutParams`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#onInterceptTouchEvent(android.view.MotionEvent) parameter #0:
-    Missing nullability on parameter `ev` in method `onInterceptTouchEvent`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#onRestoreInstanceState(android.os.Parcelable) parameter #0:
-    Missing nullability on parameter `state` in method `onRestoreInstanceState`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#onTouchEvent(android.view.MotionEvent) parameter #0:
-    Missing nullability on parameter `ev` in method `onTouchEvent`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#requestChildFocus(android.view.View, android.view.View) parameter #0:
-    Missing nullability on parameter `child` in method `requestChildFocus`
-MissingNullability: androidx.slidingpanelayout.widget.SlidingPaneLayout#requestChildFocus(android.view.View, android.view.View) parameter #1:
-    Missing nullability on parameter `focused` in method `requestChildFocus`
+NotCloseable: androidx.slidingpanelayout.widget.SlidingPaneLayout:
+    Classes that release resources (close()) should implement AutoCloseable and CloseGuard: class androidx.slidingpanelayout.widget.SlidingPaneLayout
diff --git a/slidingpanelayout/slidingpanelayout/api/current.txt b/slidingpanelayout/slidingpanelayout/api/current.txt
index 6b138d4..909f1c5 100644
--- a/slidingpanelayout/slidingpanelayout/api/current.txt
+++ b/slidingpanelayout/slidingpanelayout/api/current.txt
@@ -18,6 +18,8 @@
     method public boolean isOpen();
     method public final boolean isOverlappingEnabled();
     method public boolean isSlideable();
+    method public final boolean isUserResizable();
+    method public final boolean isUserResizingEnabled();
     method public void open();
     method public boolean openPane();
     method public void removePanelSlideListener(androidx.slidingpanelayout.widget.SlidingPaneLayout.PanelSlideListener listener);
@@ -34,11 +36,15 @@
     method public void setShadowResourceLeft(@DrawableRes int resId);
     method public void setShadowResourceRight(@DrawableRes int resId);
     method @Deprecated public void setSliderFadeColor(int);
+    method public final void setUserResizingDividerDrawable(android.graphics.drawable.Drawable? drawable);
+    method public final void setUserResizingEnabled(boolean);
     method @Deprecated public void smoothSlideClosed();
     method @Deprecated public void smoothSlideOpen();
     property @Deprecated @ColorInt public int coveredFadeColor;
     property public final boolean isOverlappingEnabled;
     property public boolean isSlideable;
+    property public final boolean isUserResizable;
+    property public final boolean isUserResizingEnabled;
     property public final int lockMode;
     property @Px public int parallaxDistance;
     property @Deprecated @ColorInt public int sliderFadeColor;
diff --git a/slidingpanelayout/slidingpanelayout/api/restricted_current.txt b/slidingpanelayout/slidingpanelayout/api/restricted_current.txt
index 6b138d4..909f1c5 100644
--- a/slidingpanelayout/slidingpanelayout/api/restricted_current.txt
+++ b/slidingpanelayout/slidingpanelayout/api/restricted_current.txt
@@ -18,6 +18,8 @@
     method public boolean isOpen();
     method public final boolean isOverlappingEnabled();
     method public boolean isSlideable();
+    method public final boolean isUserResizable();
+    method public final boolean isUserResizingEnabled();
     method public void open();
     method public boolean openPane();
     method public void removePanelSlideListener(androidx.slidingpanelayout.widget.SlidingPaneLayout.PanelSlideListener listener);
@@ -34,11 +36,15 @@
     method public void setShadowResourceLeft(@DrawableRes int resId);
     method public void setShadowResourceRight(@DrawableRes int resId);
     method @Deprecated public void setSliderFadeColor(int);
+    method public final void setUserResizingDividerDrawable(android.graphics.drawable.Drawable? drawable);
+    method public final void setUserResizingEnabled(boolean);
     method @Deprecated public void smoothSlideClosed();
     method @Deprecated public void smoothSlideOpen();
     property @Deprecated @ColorInt public int coveredFadeColor;
     property public final boolean isOverlappingEnabled;
     property public boolean isSlideable;
+    property public final boolean isUserResizable;
+    property public final boolean isUserResizingEnabled;
     property public final int lockMode;
     property @Px public int parallaxDistance;
     property @Deprecated @ColorInt public int sliderFadeColor;
diff --git a/slidingpanelayout/slidingpanelayout/lint-baseline.xml b/slidingpanelayout/slidingpanelayout/lint-baseline.xml
new file mode 100644
index 0000000..feb3cd1
--- /dev/null
+++ b/slidingpanelayout/slidingpanelayout/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    if (Build.VERSION.SDK_INT >= 18) return false"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt"/>
+    </issue>
+
+</issues>
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/SlidingPaneLayoutTest.kt b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/SlidingPaneLayoutTest.kt
index 2076ea3..8015a74 100644
--- a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/SlidingPaneLayoutTest.kt
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/SlidingPaneLayoutTest.kt
@@ -16,6 +16,11 @@
 
 package androidx.slidingpanelayout.widget
 
+import android.graphics.Canvas
+import android.graphics.ColorFilter
+import android.graphics.PixelFormat
+import android.graphics.drawable.Drawable
+import android.view.LayoutInflater
 import android.view.View
 import android.view.View.MeasureSpec
 import android.view.View.MeasureSpec.EXACTLY
@@ -247,6 +252,68 @@
             minimumWidth = 100
         }
     }
+
+    @Test
+    fun userResizingConfiguration() {
+        val context = InstrumentationRegistry.getInstrumentation().context
+        val view = SlidingPaneLayout(context)
+        val drawable = object : Drawable() {
+            var stateChanged = false
+                private set
+
+            override fun draw(canvas: Canvas) {}
+            override fun setAlpha(alpha: Int) {}
+            override fun setColorFilter(colorFilter: ColorFilter?) {}
+            @Suppress("DeprecatedCallableAddReplaceWith")
+            @Deprecated("Deprecated in Java")
+            override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
+
+            override fun isStateful(): Boolean = true
+            override fun onStateChange(state: IntArray): Boolean {
+                stateChanged = true
+                return true
+            }
+        }
+
+        // Precondition - this should be false for a detached view
+        assertWithMessage("isSlideable")
+            .that(view.isSlideable)
+            .isFalse()
+
+        view.setUserResizingDividerDrawable(drawable)
+        assertWithMessage("drawable state changed")
+            .that(drawable.stateChanged)
+            .isTrue()
+
+        assertWithMessage("isUserResizable with drawable but not enabled")
+            .that(view.isUserResizable)
+            .isFalse()
+
+        view.isUserResizingEnabled = true
+
+        assertWithMessage("isUserResizable with drawable and enabled")
+            .that(view.isUserResizable)
+            .isTrue()
+
+        view.setUserResizingDividerDrawable(null)
+
+        assertWithMessage("isUserResizable with null drawable and enabled")
+            .that(view.isUserResizable)
+            .isFalse()
+    }
+
+    @Test
+    fun userResizingConfigurationInflated() {
+        val context = InstrumentationRegistry.getInstrumentation().context
+        val inflater = LayoutInflater.from(context)
+        val view = inflater.inflate(R.layout.user_resize_config, null) as SlidingPaneLayout
+        assertWithMessage("isUserResizingEnabled")
+            .that(view.isUserResizingEnabled)
+            .isTrue()
+        assertWithMessage("isUserResizable")
+            .that(view.isUserResizable)
+            .isTrue()
+    }
 }
 
 private fun View.measureAndLayout(
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/res/layout/user_resize_config.xml b/slidingpanelayout/slidingpanelayout/src/androidTest/res/layout/user_resize_config.xml
new file mode 100644
index 0000000..d7339cb
--- /dev/null
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/res/layout/user_resize_config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2023 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<androidx.slidingpanelayout.widget.SlidingPaneLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    app:isUserResizingEnabled="true"
+    app:userResizingDividerDrawable="@android:drawable/ic_menu_add"
+    >
+
+</androidx.slidingpanelayout.widget.SlidingPaneLayout>
\ No newline at end of file
diff --git a/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt b/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt
index a9f287d..f379a96 100644
--- a/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt
+++ b/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt
@@ -29,6 +29,7 @@
 import android.view.MotionEvent
 import android.view.View
 import android.view.View.MeasureSpec
+import android.view.View.VISIBLE
 import android.view.ViewGroup
 import android.view.ViewGroup.LayoutParams
 import android.view.ViewGroup.LayoutParams.MATCH_PARENT
@@ -40,9 +41,11 @@
 import androidx.annotation.DrawableRes
 import androidx.annotation.IntDef
 import androidx.annotation.Px
+import androidx.annotation.RequiresApi
 import androidx.core.content.ContextCompat
 import androidx.core.content.withStyledAttributes
 import androidx.core.graphics.Insets
+import androidx.core.graphics.drawable.DrawableCompat
 import androidx.core.os.HandlerCompat
 import androidx.core.view.AccessibilityDelegateCompat
 import androidx.core.view.ViewCompat
@@ -419,6 +422,57 @@
 
     private val windowInfoTracker = WindowInfoTracker.getOrCreate(context)
 
+    private var userResizingDividerDrawable: Drawable? = null
+
+    /**
+     * Set a [Drawable] to display when [isUserResizingEnabled] is `true` and multiple panes are
+     * visible without overlapping. This forms the visual touch target for dragging.
+     * This may also be set from the `userResizingDividerDrawable` XML attribute during
+     * view inflation.
+     */
+    fun setUserResizingDividerDrawable(drawable: Drawable?) {
+        val old = userResizingDividerDrawable
+        if (drawable !== old) {
+            if (old != null) {
+                old.callback = null
+                unscheduleDrawable(old)
+            }
+            userResizingDividerDrawable = drawable
+            if (drawable != null) {
+                drawable.callback = this
+                if (drawable.isStateful) drawable.setState(drawableState)
+                drawable.setVisible(visibility == VISIBLE, false)
+            }
+        }
+    }
+
+    /**
+     * Set to `true` to enable user resizing of side by side panes through gestures or other inputs.
+     * This may also be set from the `isUserResizingEnabled` XML attribute during
+     * view inflation. A divider drawable must be provided; see [setUserResizingDividerDrawable]
+     * and [isUserResizable].
+     */
+    var isUserResizingEnabled: Boolean = false
+        set(value) {
+            if (value != field) {
+                field = value
+                requestLayout()
+            }
+        }
+
+    /**
+     * `true` if user resizing of side-by-side panes is currently available.
+     * This means that:
+     *
+     * - [isSlideable] is `false` (otherwise panes are overlapping, not side-by-side)
+     * - [isUserResizingEnabled] is `true`
+     * - A divider drawable has been [set][setUserResizingDividerDrawable]
+     *
+     * and not necessarily that the user themselves can change in size.
+     */
+    val isUserResizable: Boolean
+        get() = !isSlideable && isUserResizingEnabled && userResizingDividerDrawable != null
+
     init {
         setWillNotDraw(false)
         ViewCompat.setAccessibilityDelegate(this, AccessibilityDelegate())
@@ -427,6 +481,10 @@
         context.withStyledAttributes(attrs, R.styleable.SlidingPaneLayout) {
             isOverlappingEnabled =
                 getBoolean(R.styleable.SlidingPaneLayout_isOverlappingEnabled, true)
+            isUserResizingEnabled =
+                getBoolean(R.styleable.SlidingPaneLayout_isUserResizingEnabled, false)
+            userResizingDividerDrawable =
+                getDrawable(R.styleable.SlidingPaneLayout_userResizingDividerDrawable)
         }
     }
 
@@ -549,6 +607,33 @@
         }
     }
 
+    override fun drawableStateChanged() {
+        super.drawableStateChanged()
+
+        userResizingDividerDrawable?.apply {
+            if (isStateful && setState(drawableState)) {
+                invalidateDrawable(this)
+            }
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
+    override fun drawableHotspotChanged(x: Float, y: Float) {
+        super.drawableHotspotChanged(x, y)
+
+        userResizingDividerDrawable?.let {
+            DrawableCompat.setHotspot(it, x, y)
+        }
+    }
+
+    override fun verifyDrawable(who: Drawable): Boolean =
+        super.verifyDrawable(who) || who === userResizingDividerDrawable
+
+    override fun jumpDrawablesToCurrentState() {
+        super.jumpDrawablesToCurrentState()
+        userResizingDividerDrawable?.jumpToCurrentState()
+    }
+
     override fun addView(child: View, index: Int, params: ViewGroup.LayoutParams?) {
         if (childCount == 1) {
             // Wrap detail view inside a touch blocker container
diff --git a/slidingpanelayout/slidingpanelayout/src/main/res/values/attrs.xml b/slidingpanelayout/slidingpanelayout/src/main/res/values/attrs.xml
index c5a5344..459dab2 100644
--- a/slidingpanelayout/slidingpanelayout/src/main/res/values/attrs.xml
+++ b/slidingpanelayout/slidingpanelayout/src/main/res/values/attrs.xml
@@ -17,6 +17,8 @@
 <resources>
     <declare-styleable name="SlidingPaneLayout">
         <attr name="isOverlappingEnabled" format="boolean"/>
+        <attr name="isUserResizingEnabled" format="boolean"/>
+        <attr name="userResizingDividerDrawable" format="reference"/>
     </declare-styleable>
     <declare-styleable name="SlidingPaneLayout_Layout">
         <attr name="android:layout_weight"/>
diff --git a/sqlite/sqlite-framework/lint-baseline.xml b/sqlite/sqlite-framework/lint-baseline.xml
index 711185c..2f7cd12 100644
--- a/sqlite/sqlite-framework/lint-baseline.xml
+++ b/sqlite/sqlite-framework/lint-baseline.xml
@@ -1,50 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-beta03" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
-
-    <issue
-        id="NewApi"
-        message="Implicit cast from `Cursor` to `Closeable` requires API level 16 (current min is 14)"
-        errorLine1="            db.query(&quot;SELECT * FROM sqlite_master WHERE name = &apos;Foo&apos;&quot;).use {"
-        errorLine2="                                                                       ~~~">
-        <location
-            file="src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Implicit cast from `Cursor` to `Closeable` requires API level 16 (current min is 14)"
-        errorLine1="            db.query(&quot;SELECT * FROM sqlite_master WHERE name = &apos;Foo&apos;&quot;).use {"
-        errorLine2="                                                                       ~~~">
-        <location
-            file="src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Implicit cast from `Cursor` to `Closeable` requires API level 16 (current min is 14)"
-        errorLine1="            db.query(&quot;SELECT * FROM sqlite_master WHERE name = &apos;Foo&apos;&quot;).use {"
-        errorLine2="                                                                       ~~~">
-        <location
-            file="src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Implicit cast from `Cursor` to `Closeable` requires API level 16 (current min is 14)"
-        errorLine1="            db.query(&quot;SELECT * FROM sqlite_master WHERE name = &apos;Foo&apos;&quot;).use {"
-        errorLine2="                                                                       ~~~">
-        <location
-            file="src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Implicit cast from `Cursor` to `Closeable` requires API level 16 (current min is 14)"
-        errorLine1="            db.query(&quot;SELECT * FROM sqlite_master WHERE name = &apos;Foo&apos;&quot;).use {"
-        errorLine2="                                                                       ~~~">
-        <location
-            file="src/androidTest/java/androidx/sqlite/db/framework/OpenHelperRecoveryTest.kt"/>
-    </issue>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -55,4 +10,58 @@
             file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @get:RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt"/>
+    </issue>
+
 </issues>
diff --git a/sqlite/sqlite/api/api_lint.ignore b/sqlite/sqlite/api/api_lint.ignore
index d4e0d2f..b71f90d 100644
--- a/sqlite/sqlite/api/api_lint.ignore
+++ b/sqlite/sqlite/api/api_lint.ignore
@@ -79,42 +79,6 @@
     androidx.sqlite.db.SupportSQLiteQueryBuilder does not declare a `build()` method, but builder classes are expected to
 
 
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#builder(String):
-    Missing nullability on method `builder` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#builder(String) parameter #0:
-    Missing nullability on parameter `tableName` in method `builder`
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#columns(String[]):
-    Missing nullability on method `columns` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#columns(String[]) parameter #0:
-    Missing nullability on parameter `columns` in method `columns`
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#create():
-    Missing nullability on method `create` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#distinct():
-    Missing nullability on method `distinct` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#groupBy(String):
-    Missing nullability on method `groupBy` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#groupBy(String) parameter #0:
-    Missing nullability on parameter `groupBy` in method `groupBy`
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#having(String):
-    Missing nullability on method `having` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#having(String) parameter #0:
-    Missing nullability on parameter `having` in method `having`
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#limit(String):
-    Missing nullability on method `limit` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#limit(String) parameter #0:
-    Missing nullability on parameter `limit` in method `limit`
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#orderBy(String):
-    Missing nullability on method `orderBy` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#orderBy(String) parameter #0:
-    Missing nullability on parameter `orderBy` in method `orderBy`
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#selection(String, Object[]):
-    Missing nullability on method `selection` return
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#selection(String, Object[]) parameter #0:
-    Missing nullability on parameter `selection` in method `selection`
-MissingNullability: androidx.sqlite.db.SupportSQLiteQueryBuilder#selection(String, Object[]) parameter #1:
-    Missing nullability on parameter `bindArgs` in method `selection`
-
-
 StaticFinalBuilder: androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder:
     Builder must be final: androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder
 
diff --git a/sqlite/sqlite/lint-baseline.xml b/sqlite/sqlite/lint-baseline.xml
new file mode 100644
index 0000000..ca86ac7
--- /dev/null
+++ b/sqlite/sqlite/lint-baseline.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/SupportSQLiteCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/SupportSQLiteCompat.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/SupportSQLiteDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/SupportSQLiteDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/SupportSQLiteDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @get:RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/SupportSQLiteDatabase.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.kt"/>
+    </issue>
+
+</issues>
diff --git a/stableaidl/stableaidl-gradle-plugin/lint-baseline.xml b/stableaidl/stableaidl-gradle-plugin/lint-baseline.xml
deleted file mode 100644
index ac07c56..0000000
--- a/stableaidl/stableaidl-gradle-plugin/lint-baseline.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-alpha07)" variant="all" version="8.0.0-alpha07">
-
-    <issue
-        id="BanSynchronizedMethods"
-        message="Use of synchronized methods is not recommended"
-        errorLine1="        @Override"
-        errorLine2="        ^">
-        <location
-            file="src/main/java/androidx/stableaidl/internal/LoggerWrapper.java"/>
-    </issue>
-
-</issues>
diff --git a/swiperefreshlayout/swiperefreshlayout/api/api_lint.ignore b/swiperefreshlayout/swiperefreshlayout/api/api_lint.ignore
index 25a9da5..d026b7d 100644
--- a/swiperefreshlayout/swiperefreshlayout/api/api_lint.ignore
+++ b/swiperefreshlayout/swiperefreshlayout/api/api_lint.ignore
@@ -13,8 +13,6 @@
     Internal field mOriginalOffsetTop must not be exposed
 
 
-MissingNullability: androidx.swiperefreshlayout.widget.CircularProgressDrawable#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.swiperefreshlayout.widget.CircularProgressDrawable#setColorFilter(android.graphics.ColorFilter) parameter #0:
     Missing nullability on parameter `colorFilter` in method `setColorFilter`
 MissingNullability: androidx.swiperefreshlayout.widget.SwipeRefreshLayout#onInterceptTouchEvent(android.view.MotionEvent) parameter #0:
@@ -49,3 +47,7 @@
     Bare field mFrom must be marked final, or moved behind accessors if mutable
 MutableBareField: androidx.swiperefreshlayout.widget.SwipeRefreshLayout#mOriginalOffsetTop:
     Bare field mOriginalOffsetTop must be marked final, or moved behind accessors if mutable
+
+
+NotCloseable: androidx.swiperefreshlayout.widget.CircularProgressDrawable:
+    Classes that release resources (stop()) should implement AutoCloseable and CloseGuard: class androidx.swiperefreshlayout.widget.CircularProgressDrawable
diff --git a/test/ext/junit-gtest/build.gradle b/test/ext/junit-gtest/build.gradle
index f68ed86..ea12d35 100644
--- a/test/ext/junit-gtest/build.gradle
+++ b/test/ext/junit-gtest/build.gradle
@@ -45,7 +45,6 @@
 
 android {
     defaultConfig {
-        minSdkVersion 18
         externalNativeBuild {
             cmake {
                 arguments "-DANDROID_STL=c++_shared"
diff --git a/test/integration-tests/junit-gtest-test/build.gradle b/test/integration-tests/junit-gtest-test/build.gradle
index c76cbce..7d9a45d 100644
--- a/test/integration-tests/junit-gtest-test/build.gradle
+++ b/test/integration-tests/junit-gtest-test/build.gradle
@@ -37,7 +37,6 @@
 
 android {
     defaultConfig {
-        minSdkVersion 18
         externalNativeBuild {
             cmake {
                 arguments "-DANDROID_STL=c++_shared"
diff --git a/test/uiautomator/integration-tests/testapp/build.gradle b/test/uiautomator/integration-tests/testapp/build.gradle
index c4c98ec..4a2d98d 100644
--- a/test/uiautomator/integration-tests/testapp/build.gradle
+++ b/test/uiautomator/integration-tests/testapp/build.gradle
@@ -30,9 +30,5 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 18
-    }
-
     namespace "androidx.test.uiautomator.testapp"
 }
diff --git a/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml b/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
index 07c501e..d259e2c 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -15,9 +15,6 @@
 -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <uses-sdk android:minSdkVersion="18" />
-
     <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
 
     <queries>
diff --git a/test/uiautomator/uiautomator/build.gradle b/test/uiautomator/uiautomator/build.gradle
index 6ad79ca..aeb61bc 100644
--- a/test/uiautomator/uiautomator/build.gradle
+++ b/test/uiautomator/uiautomator/build.gradle
@@ -34,10 +34,6 @@
 }
 
 android {
-    defaultConfig {
-        minSdkVersion 18
-    }
-
     useLibrary "android.test.runner"
     useLibrary "android.test.base"
     useLibrary "android.test.mock"
diff --git a/testutils/testutils-datastore/src/commonMain/kotlin/androidx/datastore/OkioTestIO.kt b/testutils/testutils-datastore/src/commonMain/kotlin/androidx/datastore/OkioTestIO.kt
index af86e41..7260283 100644
--- a/testutils/testutils-datastore/src/commonMain/kotlin/androidx/datastore/OkioTestIO.kt
+++ b/testutils/testutils-datastore/src/commonMain/kotlin/androidx/datastore/OkioTestIO.kt
@@ -57,6 +57,10 @@
     override val name: String
         get() = path.name
 
+    override fun path(): String {
+        return path.normalized().toString()
+    }
+
     override fun delete(): Boolean {
         if (!fileSystem.exists(path)) {
             // to be consistent with the TestFile API.
diff --git a/testutils/testutils-datastore/src/commonMain/kotlin/androidx/datastore/TestIO.kt b/testutils/testutils-datastore/src/commonMain/kotlin/androidx/datastore/TestIO.kt
index e8e153c..33421de 100644
--- a/testutils/testutils-datastore/src/commonMain/kotlin/androidx/datastore/TestIO.kt
+++ b/testutils/testutils-datastore/src/commonMain/kotlin/androidx/datastore/TestIO.kt
@@ -100,6 +100,12 @@
      * The name of the file, including the extension
      */
     abstract val name: String
+
+    /**
+     * Get the canonical path for the file.
+     */
+    abstract fun path(): String
+
     /**
      * Deletes the file if it exists.
      * Will return `false` if the file does not exist or cannot be deleted. (similar to File.delete)
diff --git a/testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/FileTestIO.kt b/testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/FileTestIO.kt
index a21ca32..1cd29f4 100644
--- a/testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/FileTestIO.kt
+++ b/testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/FileTestIO.kt
@@ -51,6 +51,10 @@
     override val name: String
         get() = file.name
 
+    override fun path(): String {
+        return file.canonicalFile.absolutePath
+    }
+
     override fun delete(): Boolean {
         return file.delete()
     }
diff --git a/testutils/testutils-runtime/lint-baseline.xml b/testutils/testutils-runtime/lint-baseline.xml
index 057c512..a1a835e 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="6" by="lint 8.0.0-beta03" type="baseline" client="cli" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -56,19 +56,37 @@
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.testutils.LocaleTestUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                newConfig.setLocale(locales.get(0))"
-        errorLine2="                          ~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 16 &amp;&amp;"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/testutils/AnimationActivityTestRule.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            return if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/testutils/AnimationDurationScaleRule.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 ->"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/testutils/LocaleTestUtils.kt"/>
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.fragment.app.StrictFragment is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            check(!requireActivity().isDestroyed)"
-        errorLine2="                                     ~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/fragment/app/StrictFragment.kt"/>
     </issue>
diff --git a/tracing/tracing/lint-baseline.xml b/tracing/tracing/lint-baseline.xml
new file mode 100644
index 0000000..0391a7b
--- /dev/null
+++ b/tracing/tracing/lint-baseline.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18 &amp;&amp; Build.VERSION.SDK_INT &lt; 31) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tracing/Trace.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tracing/Trace.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tracing/Trace.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tracing/Trace.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tracing/Trace.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tracing/Trace.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tracing/Trace.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tracing/TraceApi18Impl.java"/>
+    </issue>
+
+</issues>
diff --git a/transition/transition/lint-baseline.xml b/transition/transition/lint-baseline.xml
index 29f82c2..be7cc6f4 100644
--- a/transition/transition/lint-baseline.xml
+++ b/transition/transition/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="ResourceType"
@@ -217,4 +217,166 @@
             file="src/main/java/androidx/transition/Styleable.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/AnimatorUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/AnimatorUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/AnimatorUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/AnimatorUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/TransitionUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/TransitionUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/TransitionUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/TransitionUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewGroupOverlayApi18.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewGroupUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewGroupUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="    @RequiresApi(18)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewGroupUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewOverlayApi18.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewUtils.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="@RequiresApi(19)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/ViewUtilsApi19.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 18"
+        errorLine1="@RequiresApi(18)"
+        errorLine2="~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/WindowIdApi18.java"/>
+    </issue>
+
 </issues>
diff --git a/tv/tv-foundation/api/api_lint.ignore b/tv/tv-foundation/api/api_lint.ignore
index 8fe1f4b..599cbcc 100644
--- a/tv/tv-foundation/api/api_lint.ignore
+++ b/tv/tv-foundation/api/api_lint.ignore
@@ -1,8 +1,4 @@
 // Baseline format: 1.0
-GetterSetterNames: androidx.tv.foundation.TvScrollState#getCanScrollBackward():
-    Getter for boolean property `canScrollBackward` is named `getCanScrollBackward` but should match the property name. Use `@get:JvmName` to rename.
-GetterSetterNames: androidx.tv.foundation.TvScrollState#getCanScrollForward():
-    Getter for boolean property `canScrollForward` is named `getCanScrollForward` but should match the property name. Use `@get:JvmName` to rename.
 GetterSetterNames: androidx.tv.foundation.lazy.grid.TvLazyGridState#getCanScrollBackward():
     Getter for boolean property `canScrollBackward` is named `getCanScrollBackward` but should match the property name. Use `@get:JvmName` to rename.
 GetterSetterNames: androidx.tv.foundation.lazy.grid.TvLazyGridState#getCanScrollForward():
diff --git a/tv/tv-material/api/api_lint.ignore b/tv/tv-material/api/api_lint.ignore
deleted file mode 100644
index 5954166..0000000
--- a/tv/tv-material/api/api_lint.ignore
+++ /dev/null
@@ -1,4 +0,0 @@
-// Baseline format: 1.0
-
-GetterSetterNames: field NavigationDrawerScope.doesNavigationDrawerHaveFocus:
-    Invalid name for boolean property `doesNavigationDrawerHaveFocus`. Should start with one of `has`, `can`, `should`, `is`.
\ No newline at end of file
diff --git a/tvprovider/tvprovider/api/api_lint.ignore b/tvprovider/tvprovider/api/api_lint.ignore
index 16230a6..3aa47b0 100644
--- a/tvprovider/tvprovider/api/api_lint.ignore
+++ b/tvprovider/tvprovider/api/api_lint.ignore
@@ -73,14 +73,6 @@
     Must avoid boxed primitives (`java.lang.Long`)
 
 
-HiddenSuperclass: androidx.tvprovider.media.tv.PreviewProgram:
-    Public class androidx.tvprovider.media.tv.PreviewProgram stripped of unavailable superclass androidx.tvprovider.media.tv.BasePreviewProgram
-HiddenSuperclass: androidx.tvprovider.media.tv.Program:
-    Public class androidx.tvprovider.media.tv.Program stripped of unavailable superclass androidx.tvprovider.media.tv.BaseProgram
-HiddenSuperclass: androidx.tvprovider.media.tv.WatchNextProgram:
-    Public class androidx.tvprovider.media.tv.WatchNextProgram stripped of unavailable superclass androidx.tvprovider.media.tv.BasePreviewProgram
-
-
 IntentName: androidx.tvprovider.media.tv.TvContractCompat.PreviewProgramColumns#COLUMN_INTERACTION_COUNT:
     Intent action constant name must be ACTION_FOO: COLUMN_INTERACTION_COUNT
 IntentName: androidx.tvprovider.media.tv.TvContractCompat.PreviewProgramColumns#COLUMN_INTERACTION_TYPE:
diff --git a/vectordrawable/integration-tests/testapp/lint-baseline.xml b/vectordrawable/integration-tests/testapp/lint-baseline.xml
index 7ed06df..7b5d464 100644
--- a/vectordrawable/integration-tests/testapp/lint-baseline.xml
+++ b/vectordrawable/integration-tests/testapp/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -12,7 +12,7 @@
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -21,7 +21,7 @@
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -30,7 +30,7 @@
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -39,7 +39,7 @@
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -48,7 +48,7 @@
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -57,7 +57,7 @@
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:aapt=&quot;http://schemas.android.com/aapt&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -66,7 +66,7 @@
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -75,7 +75,7 @@
 
     <issue
         id="NewApi"
-        message="`&lt;animated-vector>` requires API level 21 (current min is 14)"
+        message="`&lt;animated-vector>` requires API level 21 (current min is 19)"
         errorLine1="&lt;animated-vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
         errorLine2=" ~~~~~~~~~~~~~~~">
         <location
@@ -84,7 +84,7 @@
 
     <issue
         id="NewApi"
-        message="Using theme references in XML drawables requires API level 21 (current min is 14)"
+        message="Using theme references in XML drawables requires API level 21 (current min is 19)"
         errorLine1="                        android:fillColor=&quot;?android:attr/colorForeground&quot;"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -93,7 +93,7 @@
 
     <issue
         id="NewApi"
-        message="Using theme references in XML drawables requires API level 21 (current min is 14)"
+        message="Using theme references in XML drawables requires API level 21 (current min is 19)"
         errorLine1="                        android:strokeColor=&quot;?android:attr/colorForeground&quot;"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -102,7 +102,7 @@
 
     <issue
         id="NewApi"
-        message="Using theme references in XML drawables requires API level 21 (current min is 14)"
+        message="Using theme references in XML drawables requires API level 21 (current min is 19)"
         errorLine1="                        android:fillColor=&quot;?android:attr/colorForeground&quot;"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -111,7 +111,7 @@
 
     <issue
         id="NewApi"
-        message="Using theme references in XML drawables requires API level 21 (current min is 14)"
+        message="Using theme references in XML drawables requires API level 21 (current min is 19)"
         errorLine1="                        android:strokeColor=&quot;?android:attr/colorForeground&quot;"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/vectordrawable/vectordrawable-animated/api/api_lint.ignore b/vectordrawable/vectordrawable-animated/api/api_lint.ignore
index 357c7df..ffe6f52 100644
--- a/vectordrawable/vectordrawable-animated/api/api_lint.ignore
+++ b/vectordrawable/vectordrawable-animated/api/api_lint.ignore
@@ -3,3 +3,7 @@
     Missing nullability on parameter `bounds` in method `onBoundsChange`
 MissingNullability: androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat#onStateChange(int[]) parameter #0:
     Missing nullability on parameter `state` in method `onStateChange`
+
+
+NotCloseable: androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat:
+    Classes that release resources (stop()) should implement AutoCloseable and CloseGuard: class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
diff --git a/vectordrawable/vectordrawable-seekable/api/api_lint.ignore b/vectordrawable/vectordrawable-seekable/api/api_lint.ignore
new file mode 100644
index 0000000..cecf462
--- /dev/null
+++ b/vectordrawable/vectordrawable-seekable/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+NotCloseable: androidx.vectordrawable.graphics.drawable.SeekableAnimatedVectorDrawable:
+    Classes that release resources (stop()) should implement AutoCloseable and CloseGuard: class androidx.vectordrawable.graphics.drawable.SeekableAnimatedVectorDrawable
diff --git a/vectordrawable/vectordrawable/lint-baseline.xml b/vectordrawable/vectordrawable/lint-baseline.xml
index f647f1f..bcb268b 100644
--- a/vectordrawable/vectordrawable/lint-baseline.xml
+++ b/vectordrawable/vectordrawable/lint-baseline.xml
@@ -1,5 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java"/>
+    </issue>
 
     <issue
         id="UnknownNullness"
diff --git a/viewpager/viewpager/api/api_lint.ignore b/viewpager/viewpager/api/api_lint.ignore
index 908ecb2..de6c3f68 100644
--- a/viewpager/viewpager/api/api_lint.ignore
+++ b/viewpager/viewpager/api/api_lint.ignore
@@ -13,8 +13,6 @@
     Listeners should be an interface, or otherwise renamed Callback: SimpleOnPageChangeListener
 
 
-MissingNullability: androidx.viewpager.widget.PagerTabStrip#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.viewpager.widget.PagerTabStrip#onTouchEvent(android.view.MotionEvent) parameter #0:
     Missing nullability on parameter `ev` in method `onTouchEvent`
 MissingNullability: androidx.viewpager.widget.PagerTabStrip#setBackgroundDrawable(android.graphics.drawable.Drawable) parameter #0:
@@ -33,8 +31,6 @@
     Missing nullability on parameter `event` in method `dispatchKeyEvent`
 MissingNullability: androidx.viewpager.widget.ViewPager#dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent) parameter #0:
     Missing nullability on parameter `event` in method `dispatchPopulateAccessibilityEvent`
-MissingNullability: androidx.viewpager.widget.ViewPager#draw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `draw`
 MissingNullability: androidx.viewpager.widget.ViewPager#generateDefaultLayoutParams():
     Missing nullability on method `generateDefaultLayoutParams` return
 MissingNullability: androidx.viewpager.widget.ViewPager#generateLayoutParams(android.util.AttributeSet):
@@ -45,8 +41,6 @@
     Missing nullability on method `generateLayoutParams` return
 MissingNullability: androidx.viewpager.widget.ViewPager#generateLayoutParams(android.view.ViewGroup.LayoutParams) parameter #0:
     Missing nullability on parameter `p` in method `generateLayoutParams`
-MissingNullability: androidx.viewpager.widget.ViewPager#onDraw(android.graphics.Canvas) parameter #0:
-    Missing nullability on parameter `canvas` in method `onDraw`
 MissingNullability: androidx.viewpager.widget.ViewPager#onInterceptTouchEvent(android.view.MotionEvent) parameter #0:
     Missing nullability on parameter `ev` in method `onInterceptTouchEvent`
 MissingNullability: androidx.viewpager.widget.ViewPager#onRequestFocusInDescendants(int, android.graphics.Rect) parameter #1:
diff --git a/viewpager2/integration-tests/testapp/lint-baseline.xml b/viewpager2/integration-tests/testapp/lint-baseline.xml
index 2120164..0ae775c 100644
--- a/viewpager2/integration-tests/testapp/lint-baseline.xml
+++ b/viewpager2/integration-tests/testapp/lint-baseline.xml
@@ -1,29 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
-        id="NewApi"
-        message="Call requires API level 19 (current min is 14): `java.lang.AssertionError()`"
-        errorLine1="                throw AssertionError(&quot;Block hit bad state $n times&quot;, e)"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/viewpager2/integration/testapp/test/util/RetryBlock.kt"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        textDirection = View.TEXT_DIRECTION_LOCALE"
-        errorLine2="                        ~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/viewpager2/integration/testapp/MutableCollectionBaseActivity.kt"/>
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        textDirection = View.TEXT_DIRECTION_LOCALE"
-        errorLine2="                        ~~~~~~~~~~~~~">
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                    if (Build.VERSION.SDK_INT >= 17) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/viewpager2/integration/testapp/MutableCollectionBaseActivity.kt"/>
     </issue>
diff --git a/viewpager2/viewpager2/lint-baseline.xml b/viewpager2/viewpager2/lint-baseline.xml
index 0020cc5..cbf2f21 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="6" by="lint 8.0.0-beta03" type="baseline" client="gradle" dependencies="false" name="AGP (8.0.0-beta03)" variant="all" version="8.0.0-beta03">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -19,4 +19,31 @@
             file="src/androidTest/java/androidx/viewpager2/widget/swipe/ManualSwipeInjector.java"/>
     </issue>
 
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(17)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/viewpager2/widget/ViewPager2.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 16"
+        errorLine1="    @RequiresApi(16)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/viewpager2/widget/ViewPager2.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 16) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/viewpager2/widget/ViewPager2.java"/>
+    </issue>
+
 </issues>
diff --git a/wear/compose/compose-foundation/lint-baseline.xml b/wear/compose/compose-foundation/lint-baseline.xml
index 7d8acbf..8d1a56a 100644
--- a/wear/compose/compose-foundation/lint-baseline.xml
+++ b/wear/compose/compose-foundation/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha02" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha02)" variant="all" version="8.3.0-alpha02">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="PrimitiveInCollection"
@@ -210,24 +210,6 @@
 
     <issue
         id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method expandableItems has parameter &apos;key&apos; with type Function1&lt;? super Integer, ? extends Object>."
-        errorLine1="    key: ((index: Int) -> Any)? = null,"
-        errorLine2="         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/compose/foundation/Expandable.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method expandableItems has parameter &apos;itemContent&apos; with type Function2&lt;? super BoxScope, ? super Integer, Unit>."
-        errorLine1="    itemContent: @Composable BoxScope.(index: Int) -> Unit"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/compose/foundation/Expandable.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method items has parameter &apos;key&apos; with type Function1&lt;? super Integer, ? extends Object>."
         errorLine1="        key: ((index: Int) -> Any)? = null,"
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~">
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedComposable.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedComposable.kt
index 64fc086..22a6db3 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedComposable.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedComposable.kt
@@ -151,7 +151,9 @@
         val radiusToTopLeft = outerRadius
 
         // Distance from the center of the CurvedRow to the top center of the component.
-        val radiusToTopCenter = sqrt(pow2(radiusToTopLeft) - pow2(placeable.width / 2f))
+        val radiusToTopCenter = sqrt(
+            (pow2(radiusToTopLeft) - pow2(placeable.width / 2f)).coerceAtLeast(0f)
+        )
 
         // To position this child, we move its center rotating it around the CurvedRow's center.
         val radiusToCenter = radiusToTopCenter - placeable.height / 2f
diff --git a/wear/compose/compose-material/lint-baseline.xml b/wear/compose/compose-material/lint-baseline.xml
index 4818b317..6e73454 100644
--- a/wear/compose/compose-material/lint-baseline.xml
+++ b/wear/compose/compose-material/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-beta01" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-beta01)" variant="all" version="8.2.0-beta01">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="PrimitiveInCollection"
@@ -336,15 +336,6 @@
 
     <issue
         id="PrimitiveInLambda"
-        message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method PositionIndicator has parameter &apos;value&apos; with type Function0&lt;Float>."
-        errorLine1="    value: () -> Float,"
-        errorLine2="           ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/compose/material/PositionIndicator.kt"/>
-    </issue>
-
-    <issue
-        id="PrimitiveInLambda"
         message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable &apos;boundsSize&apos; with type Function1&lt;? super Density, ? extends IntSize>."
         errorLine1="    val boundsSize: Density.() -> IntSize = {"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~">
diff --git a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/ToggleButton.kt b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/ToggleButton.kt
index 2c3cb43..afd00b2 100644
--- a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/ToggleButton.kt
+++ b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/ToggleButton.kt
@@ -383,6 +383,32 @@
  * Represents the different container and content colors used for toggle buttons
  * ([ToggleButton], [IconToggleButton], and [TextToggleButton]) in various states,
  * that are checked, unchecked, enabled and disabled.
+ *
+ * @constructor [ToggleButtonColors] constructor to be used with [ToggleButton]
+ * @param checkedContainerColor Container or background color when the toggle button is checked
+ * @param checkedContentColor Color of the content like label when the toggle button is checked
+ * @param checkedSecondaryContentColor Color of the secondary content like secondary label when the
+ * toggle button is checked
+ * @param checkedIconColor Color of the icon when the toggle button is checked
+ * @param uncheckedContainerColor Container or background color when the toggle button is unchecked
+ * @param uncheckedContentColor Color of the content like label when the toggle button is unchecked
+ * @param uncheckedSecondaryContentColor Color of the secondary content like secondary label when
+ * the toggle button is unchecked
+ * @param uncheckedIconColor Color of the icon when the toggle button is unchecked
+ * @param disabledCheckedContainerColor Container or background color when the toggle button is
+ * disabled and checked
+ * @param disabledCheckedContentColor Color of content like label when the toggle button is
+ * disabled and checked
+ * @param disabledCheckedSecondaryContentColor Color of the secondary content like secondary label
+ * when the toggle button is disabled and checked
+ * @param disabledCheckedIconColor Icon color when the toggle button is disabled and checked
+ * @param disabledUncheckedContainerColor Container or background color when the toggle button is
+ * disabled and unchecked
+ * @param disabledUncheckedContentColor Color of the content like label when the toggle button is
+ * disabled and unchecked
+ * @param disabledUncheckedSecondaryContentColor Color of the secondary content like secondary label
+ * when the toggle button is disabled and unchecked
+ * @param disabledUncheckedIconColor Icon color when the toggle button is disabled and unchecked
  */
 @Immutable
 class ToggleButtonColors constructor(
@@ -403,6 +429,25 @@
     val disabledUncheckedSecondaryContentColor: Color,
     val disabledUncheckedIconColor: Color,
 ) {
+    /**
+     * [ToggleButtonColors] constructor for [IconToggleButton] and [TextToggleButton].
+     *
+     * @param checkedContainerColor Container or background color of the toggle button when checked
+     * @param checkedContentColor Color of the content (text or icon) of the toggle button when
+     * checked
+     * @param uncheckedContainerColor Container or background color of the toggle button when
+     * unchecked
+     * @param uncheckedContentColor Color of the content (text or icon) of the toggle button when
+     * unchecked
+     * @param disabledCheckedContainerColor Container or background color of the toggle button when
+     * disabled and checked
+     * @param disabledCheckedContentColor Color of the content (icon or text) toggle button when
+     * disabled and unchecked
+     * @param disabledUncheckedContainerColor Container or background color of the toggle button
+     * when disabled and unchecked
+     * @param disabledUncheckedContentColor Color of the content (icon or text) toggle button when
+     * disabled and unchecked
+     */
     constructor(
         checkedContainerColor: Color,
         checkedContentColor: Color,
@@ -563,6 +608,39 @@
 
 /**
  * Represents the different colors used in [SplitToggleButton] in different states.
+ *
+ * @constructor [SplitToggleButtonColors] constructor to be used with [SplitToggleButton]
+ * @param checkedContainerColor Container or background color when the split toggle button is
+ * checked
+ * @param checkedContentColor Color of the content like label when the split toggle button is
+ * checked
+ * @param checkedSecondaryContentColor Color of the secondary content like secondary label when the
+ * split toggle button is checked
+ * @param checkedSplitContainerColor Split container color when the split toggle button is checked
+ * @param uncheckedContainerColor Container or background color when the split toggle button is
+ * unchecked
+ * @param uncheckedContentColor Color of the content like label when the split toggle button is
+ * unchecked
+ * @param uncheckedSecondaryContentColor Color of the secondary content like secondary label when
+ * the split toggle button is unchecked
+ * @param uncheckedSplitContainerColor Split container color when the split toggle button is
+ * unchecked
+ * @param disabledCheckedContainerColor Container color when the split toggle button is disabled
+ * and checked
+ * @param disabledCheckedContentColor Color of the content like label when the split toggle button
+ * is disabled and checked
+ * @param disabledCheckedSecondaryContentColor Color of the secondary content like secondary label
+ * when the split toggle button is disabled and checked
+ * @param disabledCheckedSplitContainerColor Split container color when the split toggle button is
+ * disabled and checked
+ * @param disabledUncheckedContainerColor Container color when the split toggle button is unchecked
+ * and disabled
+ * @param disabledUncheckedContentColor Color of the content like label when the split toggle
+ * button is unchecked and disabled
+ * @param disabledUncheckedSecondaryContentColor Color of the secondary content like secondary
+ * label when the split toggle button is unchecked and disabled
+ * @param disabledUncheckedSplitContainerColor Split container color when the split toggle button
+ * is unchecked and disabled
  */
 class SplitToggleButtonColors constructor(
     val checkedContainerColor: Color,
diff --git a/wear/protolayout/protolayout-proto/src/main/proto/color.proto b/wear/protolayout/protolayout-proto/src/main/proto/color.proto
index d2377f0..1addb4d 100644
--- a/wear/protolayout/protolayout-proto/src/main/proto/color.proto
+++ b/wear/protolayout/protolayout-proto/src/main/proto/color.proto
@@ -53,7 +53,7 @@
   //
   // A color stop is a pair of a color and its offset in the gradient.
   // The offset is the relative position of the color, beginning with 0 from the
-  // start angle and ending with 1.0 after spanning 360 degrees clockwise.
+  // start angle and ending with 1.0 at the end angle, spanning clockwise.
   //
   // There must be at least 2 colors.
   //
@@ -64,11 +64,23 @@
   // results.
   repeated ColorStop color_stops = 1;
 
-  // The angular shift relative to the element's parent base angle. This is used
-  // to shift the start angle of the gradient.
+  // The start angle of the gradient relative to the element's base angle. If
+  // not set, defaults to zero.
   //
-  // For ArcLine, the base angle is the angle where the line starts.
-  DegreesProp angular_shift = 2;
+  // For ArcLine, the base angle is the angle where the line starts. The value
+  // represents a relative position in the line's length span. Values greater
+  // than 360 degrees correspond to upper layers of the arc line as it wraps
+  // over itself.
+  DegreesProp start_angle = 2;
+
+  // The end angle of the gradient, relative to the element's base angle. If not
+  // set, defaults to 360 degrees.
+  //
+  // For ArcLine, the base angle is the angle where the line starts. The value
+  // represents a relative position in the line's length span. Values greater
+  // than 360 degrees correspond to upper layers of the arc line as it wraps
+  // over itself.
+  DegreesProp end_angle = 3;
 }
 
 // A Brush describes how something is drawn on screen.
diff --git a/wear/protolayout/protolayout-proto/src/main/proto/layout.proto b/wear/protolayout/protolayout-proto/src/main/proto/layout.proto
index f248a31..ab3c6c2 100644
--- a/wear/protolayout/protolayout-proto/src/main/proto/layout.proto
+++ b/wear/protolayout/protolayout-proto/src/main/proto/layout.proto
@@ -83,9 +83,29 @@
 
 // The styling of a font (e.g. font size, and metrics).
 message FontStyle {
-  // The size of the font, in scaled pixels (sp). If not specified, defaults to
-  // the size of the system's "body" font.
-  SpProp size = 1;
+  // The available sizes of the font, in scaled pixels (sp). If not specified, defaults to the size
+  // of the system's "body" font.
+  //
+  // If more than one size is specified and this FontStyle is applied to a Text element with static
+  // text, the text size will be automatically picked from the provided sizes to try to perfectly
+  // fit within its parent bounds. In other words, the largest size from the specified preset sizes
+  // that can fit the most text within the parent bounds will be used.
+  //
+  // The specified sizes don't have to be sorted. The maximum number of sizes used is limited to 10.
+  //
+  // Note that, if multiple sizes are set, the parent of the Text element this corresponds to
+  // shouldn't have its width and height set to wrapped, as it can lead to unexpected results.
+  //
+  // If this FontStyle is set to any other element besides Text, or that Text element has dynamic
+  // field, only the last added size will be use.
+  //
+  // Any previously added values with this method or #setSize will be cleared.
+  //
+  // While this field is accessible from 1.0 as singular, it only accepts multiple values since
+  // version 1.3 and renderers supporting version 1.3 will use the multiple values to automatically
+  // scale text. Renderers who don't support this version will use the first size among multiple
+  // values.
+  repeated SpProp size = 1;
 
   // Whether the text should be rendered in a italic typeface. If not specified,
   // defaults to "false".
diff --git a/wear/protolayout/protolayout-renderer/api/restricted_current.txt b/wear/protolayout/protolayout-renderer/api/restricted_current.txt
index e393e1d..215e3f8 100644
--- a/wear/protolayout/protolayout-renderer/api/restricted_current.txt
+++ b/wear/protolayout/protolayout-renderer/api/restricted_current.txt
@@ -1,10 +1,28 @@
 // Signature format: 4.0
+package androidx.wear.protolayout.renderer.common {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface LoggingUtils {
+    method public boolean canLogD(String);
+    method public void logD(String, String);
+    method @com.google.errorprone.annotations.FormatMethod public void logD(String, @com.google.errorprone.annotations.FormatString String, java.lang.Object!...);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class LoggingUtilsImpl implements androidx.wear.protolayout.renderer.common.LoggingUtils {
+    ctor public LoggingUtilsImpl(android.content.ComponentName);
+    method public boolean canLogD(String);
+    method public void logD(String, String);
+    method @com.google.errorprone.annotations.FormatMethod public void logD(String, @com.google.errorprone.annotations.FormatString String, java.lang.Object!...);
+  }
+
+}
+
 package androidx.wear.protolayout.renderer.impl {
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ProtoLayoutViewInstance implements java.lang.AutoCloseable {
     ctor public ProtoLayoutViewInstance(androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.Config);
     method public void close() throws java.lang.Exception;
     method @UiThread public void detach(android.view.ViewGroup);
+    method public void invalidateCache();
     method @UiThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> renderAndAttach(androidx.wear.protolayout.proto.LayoutElementProto.Layout, androidx.wear.protolayout.proto.ResourceProto.Resources, android.view.ViewGroup);
   }
 
@@ -12,6 +30,7 @@
     method public com.google.common.util.concurrent.ListeningExecutorService getBgExecutorService();
     method public String getClickableIdExtra();
     method public androidx.wear.protolayout.renderer.impl.ProtoLayoutViewInstance.LoadActionListener getLoadActionListener();
+    method public androidx.wear.protolayout.renderer.common.LoggingUtils? getLoggingUtils();
     method public java.util.Map<androidx.wear.protolayout.expression.pipeline.PlatformDataProvider!,java.util.Set<androidx.wear.protolayout.expression.PlatformDataKey<?>!>!> getPlatformDataProviders();
     method public androidx.wear.protolayout.expression.pipeline.StateStore? getStateStore();
     method public android.content.Context getUiContext();
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/common/LoggingUtils.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/common/LoggingUtils.java
new file mode 100644
index 0000000..c3e6fa4
--- /dev/null
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/common/LoggingUtils.java
@@ -0,0 +1,33 @@
+package androidx.wear.protolayout.renderer.common;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+
+import com.google.errorprone.annotations.FormatMethod;
+import com.google.errorprone.annotations.FormatString;
+
+/**
+ * Logger used for extensive logging. Note that all logs will contain the component name. To enable
+ * logs use the following command:
+ *
+ * <pre>
+ *   adb shell setprop log.tag.class_tag DEBUG
+ * </pre>
+ */
+@RestrictTo(Scope.LIBRARY_GROUP_PREFIX)
+public interface LoggingUtils {
+
+    /** LogD a formatted message. */
+    void logD(@NonNull String tag,@NonNull  String message);
+
+    /** LogD a formatted message. */
+    @FormatMethod
+    void logD(@NonNull String tag, @NonNull @FormatString String format, @NonNull Object... args);
+
+    /**
+     * Check whether debug logging is allowed or not for the given {@code tag}. This will allow
+     * clients to skip building logs if it's not necessary.
+     */
+    boolean canLogD(@NonNull String tag);
+}
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/common/LoggingUtilsImpl.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/common/LoggingUtilsImpl.java
new file mode 100644
index 0000000..7cd6b42
--- /dev/null
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/common/LoggingUtilsImpl.java
@@ -0,0 +1,54 @@
+package androidx.wear.protolayout.renderer.common;
+
+import android.content.ComponentName;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+
+import com.google.errorprone.annotations.FormatMethod;
+import com.google.errorprone.annotations.FormatString;
+
+/**
+ * Logger used for extensive logging. Note that all logs will contain the component name. To enable
+ * logs use the following command:
+ *
+ * <pre>
+ *   adb shell setprop log.tag.class_tag DEBUG
+ * </pre>
+ */
+@RestrictTo(Scope.LIBRARY_GROUP_PREFIX)
+public class LoggingUtilsImpl implements LoggingUtils {
+
+    @NonNull private final ComponentName mComponent;
+
+    public LoggingUtilsImpl(@NonNull ComponentName component) {
+        this.mComponent = component;
+    }
+
+    @Override
+    public void logD(@NonNull String tag, @NonNull String message) {
+        logInternal(tag, message);
+    }
+
+    @Override
+    @FormatMethod
+    public void logD(
+        @NonNull String tag,
+        @NonNull @FormatString String format,
+        @NonNull Object... args) {
+        logD(tag, String.format(format, args));
+    }
+
+    private void logInternal(@NonNull String tag, @NonNull String message) {
+        if (canLogD(tag)) {
+            Log.d(tag, "Logs for: " + mComponent + "\n" + message);
+        }
+    }
+
+    @Override
+    public boolean canLogD(@NonNull String tag) {
+        return Log.isLoggable(tag, Log.DEBUG);
+    }
+}
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/dynamicdata/ProtoLayoutDynamicDataPipeline.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/dynamicdata/ProtoLayoutDynamicDataPipeline.java
index 7f0c9a9..af1619c 100644
--- a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/dynamicdata/ProtoLayoutDynamicDataPipeline.java
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/dynamicdata/ProtoLayoutDynamicDataPipeline.java
@@ -74,6 +74,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
@@ -145,13 +146,16 @@
         DynamicTypeEvaluator.Config.Builder evaluatorConfigBuilder =
                 new DynamicTypeEvaluator.Config.Builder().setStateStore(stateStore);
         evaluatorConfigBuilder.setDynamicTypesQuotaManager(dynamicNodeQuotaManager);
-        this.mTimeNotifier = new PlatformTimeUpdateNotifierImpl();
-        evaluatorConfigBuilder.setPlatformTimeUpdateNotifier(this.mTimeNotifier);
         for (Map.Entry<PlatformDataProvider, Set<PlatformDataKey<?>>> providerEntry :
                 platformDataProviders.entrySet()) {
             evaluatorConfigBuilder.addPlatformDataProvider(
                     providerEntry.getKey(), providerEntry.getValue());
         }
+        this.mTimeNotifier = new PlatformTimeUpdateNotifierImpl();
+
+        evaluatorConfigBuilder.setPlatformTimeUpdateNotifier(this.mTimeNotifier);
+        mTimeNotifier.setUpdatesEnabled(true);
+
         if (enableAnimations) {
             evaluatorConfigBuilder.setAnimationQuotaManager(animationQuotaManager);
         }
@@ -259,17 +263,18 @@
          * Clears the current data in the {@link ProtoLayoutDynamicDataPipeline} instance that was
          * used to create this and then commits any stored changes.
          *
-         * @param parentView The parent view these nodes are being inflated into. This will be used
-         *     for content transition animations.
+         * @param inflatedParent The renderer-owned parent view for all of the layout elements
+         *     associated with the nodes in this pipeline. This will be used for content transition
+         *     animations.
          * @param isReattaching if True, this layout is being reattached and will skip content
          *     transition animations.
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @UiThread
         public void clearDataPipelineAndCommit(
-                @NonNull ViewGroup parentView, boolean isReattaching) {
+                @NonNull ViewGroup inflatedParent, boolean isReattaching) {
             this.mPipeline.clear();
-            this.commit(parentView, isReattaching);
+            this.commit(inflatedParent, isReattaching);
         }
 
         /**
@@ -289,6 +294,20 @@
                 @NonNull ViewGroup parentView, boolean isReattaching, @Nullable Runnable onEnd) {
             mPipeline.cancelContentTransitionAnimations();
 
+            // This is needed because onEnd should be called only once. In case that there are exit
+            // animations that can't be played due to no quota, QuotaAwaraAnimationSet will try to
+            // play it, fail and call onEnd. However, the counter of number of played animation will
+            // stay 0, so the outer condition will also be true and onEnd will be called again.
+            AtomicBoolean onEndWasCalled = new AtomicBoolean(false);
+            Runnable wrappedOnEnd =
+                    onEnd != null
+                            ? () -> {
+                                if (!onEndWasCalled.getAndSet(true)) {
+                                    onEnd.run();
+                                }
+                            }
+                            : null;
+
             if (!isReattaching && mPipeline.mFullyVisible && mPipeline.mEnableAnimations) {
                 Map<String, ExitTransition> animatingNodes = new ArrayMap<>();
                 for (String parentOfChangedNodes : mParentsOfChangedNodes) {
@@ -317,11 +336,11 @@
                                             mPipeline.mAnimationQuotaManager,
                                             associatedView,
                                             () -> {
-                                                if (onEnd != null) {
+                                                if (wrappedOnEnd != null) {
                                                     mExitAnimationsCounter--;
                                                     if (mExitAnimationsCounter == 0) {
                                                         mPipeline.mExitAnimations.clear();
-                                                        onEnd.run();
+                                                        wrappedOnEnd.run();
                                                     }
                                                 }
                                             });
@@ -334,9 +353,9 @@
                     }
                 }
             }
-            if (mPipeline.mExitAnimations.isEmpty() && onEnd != null) {
+            if (mPipeline.mExitAnimations.isEmpty() && wrappedOnEnd != null) {
                 // No exit animations.
-                onEnd.run();
+                wrappedOnEnd.run();
             }
         }
 
@@ -363,17 +382,16 @@
          * was used to create this. This replaces any already available node and should be called
          * only once per layout update.
          *
-         * @param parentView The parent view these nodes are being inflated into. This will be used
-         *     for Enter animations. If this view is not attached to a window, the animations (and
-         *     the rest of pipeline init) will be scheduled to run when the view attaches to a
+         * @param inflatedParent The parent view these nodes are being inflated into. This will be
+         *     used for Enter animations. If this view is not attached to a window, the animations
+         *     (and the rest of pipeline init) will be scheduled to run when the view attaches to a
          *     window later
          * @param isReattaching if True, this layout is being reattached and will skip content
          *     transition animations.
          */
         @UiThread
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @SuppressWarnings("RestrictTo")
-        public void commit(@NonNull ViewGroup parentView, boolean isReattaching) {
+        public void commit(@NonNull ViewGroup inflatedParent, boolean isReattaching) {
             for (String nodePosId : mNodesPendingChildrenRemoval) {
                 mPipeline.removeChildNodesFor(nodePosId);
             }
@@ -420,16 +438,15 @@
             Runnable initLayoutRunnable =
                     () -> {
                         mPipeline.initNewLayout();
-                        playEnterAnimations(parentView, isReattaching, enterTransitionNodes);
+                        playEnterAnimations(inflatedParent, isReattaching, enterTransitionNodes);
                     };
 
             // Slide animations need to know the new measurements of the view in order to calculate
             // start and end positions, so we force a measure pass.
             if (hasSlideInAnimation) {
                 // The GlobalLayoutListener ensures that initLayoutRunnable will run after the
-                // measure
-                // pass has finished.
-                ViewTreeObserver viewTreeObserver = parentView.getViewTreeObserver();
+                // measure pass has finished.
+                ViewTreeObserver viewTreeObserver = inflatedParent.getViewTreeObserver();
                 viewTreeObserver.addOnGlobalLayoutListener(
                         new OnGlobalLayoutListener() {
                             @Override
@@ -440,11 +457,11 @@
                                 }
                             }
                         });
-                parentView.measure(
+                inflatedParent.measure(
                         MeasureSpec.makeMeasureSpec(
-                                parentView.getMeasuredWidth(), MeasureSpec.EXACTLY),
+                                inflatedParent.getMeasuredWidth(), MeasureSpec.EXACTLY),
                         MeasureSpec.makeMeasureSpec(
-                                parentView.getMeasuredHeight(), MeasureSpec.EXACTLY));
+                                inflatedParent.getMeasuredHeight(), MeasureSpec.EXACTLY));
             } else {
                 initLayoutRunnable.run();
             }
@@ -512,6 +529,7 @@
          * {@link PipelineMaker} is committed with {@link PipelineMaker#commit}.
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
+        @SuppressWarnings("RestrictTo")
         @NonNull
         public PipelineMaker addPipelineFor(
                 @NonNull DynamicInt32 int32Source,
@@ -544,6 +562,7 @@
          * {@link PipelineMaker} is committed with {@link PipelineMaker#commit}.
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
+        @SuppressWarnings("RestrictTo")
         @NonNull
         public PipelineMaker addPipelineFor(
                 @NonNull DynamicString stringSource,
@@ -577,6 +596,7 @@
          * {@link PipelineMaker} is committed with {@link PipelineMaker#commit}.
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
+        @SuppressWarnings("RestrictTo")
         @NonNull
         public PipelineMaker addPipelineFor(
                 @NonNull DynamicFloat floatSource,
@@ -609,6 +629,7 @@
          * {@link PipelineMaker} is committed with {@link PipelineMaker#commit}.
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
+        @SuppressWarnings("RestrictTo")
         @NonNull
         public PipelineMaker addPipelineFor(
                 @NonNull DynamicColor colorSource,
@@ -657,6 +678,7 @@
          * {@link PipelineMaker} is committed with {@link PipelineMaker#commit}.
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
+        @SuppressWarnings("RestrictTo")
         @NonNull
         public PipelineMaker addPipelineFor(
                 @NonNull DynamicBool boolSource,
@@ -671,7 +693,6 @@
          * Add the given source to the pipeline for future evaluation. Evaluation will start when
          * {@link PipelineMaker} is committed with {@link PipelineMaker#commit}.
          */
-        @SuppressWarnings("RestrictTo")
         @NonNull
         @RestrictTo(Scope.LIBRARY_GROUP)
         public PipelineMaker addPipelineFor(
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java
index 798f1ad..5f95a07 100644
--- a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstance.java
@@ -51,6 +51,7 @@
 import androidx.wear.protolayout.renderer.ProtoLayoutExtensionViewProvider;
 import androidx.wear.protolayout.renderer.ProtoLayoutTheme;
 import androidx.wear.protolayout.renderer.ProtoLayoutVisibilityState;
+import androidx.wear.protolayout.renderer.common.LoggingUtils;
 import androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer;
 import androidx.wear.protolayout.renderer.dynamicdata.ProtoLayoutDynamicDataPipeline;
 import androidx.wear.protolayout.renderer.inflater.ProtoLayoutInflater;
@@ -73,6 +74,7 @@
 
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
@@ -112,6 +114,7 @@
     @NonNull private final ListeningExecutorService mUiExecutorService;
     @NonNull private final ListeningExecutorService mBgExecutorService;
     @NonNull private final String mClickableIdExtra;
+    @Nullable private final LoggingUtils mLoggingUtils;
 
     @Nullable private final ProtoLayoutExtensionViewProvider mExtensionViewProvider;
 
@@ -152,6 +155,13 @@
     private boolean mPrevLayoutAlreadyFailingDepthCheck = false;
 
     /**
+     * This is used to make sure resource version changes invalidate the layout. Otherwise, this
+     * could result in the resource change not getting reflected with diff rendering (if the layout
+     * pointing to that resource hasn't changed)
+     */
+    @Nullable private String mPrevResourcesVersion = null;
+
+    /**
      * This is used as the Future for the currently running inflation session. The first time
      * "attach" is called, it should start the renderer. Subsequent attach calls should only ever
      * re-attach "inflateParent".
@@ -202,13 +212,15 @@
         /**
          * Run any final inflation steps that need to be run on the Ui thread.
          *
+         * @param attachParent the parent view to which newly inflated layouts should attach.
+         * @param prevInflateParent the parent view for the previously inflated layout.
          * @param isReattaching if True, this layout is being reattached and will skip content
          *     transition animations.
          */
         @UiThread
         @NonNull
         ListenableFuture<Void> postInflate(
-                @NonNull ViewGroup parent,
+                @NonNull ViewGroup attachParent,
                 @Nullable ViewGroup prevInflateParent,
                 boolean isReattaching);
     }
@@ -223,12 +235,13 @@
         @NonNull
         @Override
         public ListenableFuture<Void> postInflate(
-                @NonNull ViewGroup parent,
+                @NonNull ViewGroup attachParent,
                 @Nullable ViewGroup prevInflateParent,
                 boolean isReattaching) {
             return Futures.immediateVoidFuture();
         }
     }
+
     /** Result of a {@link #renderOrComputeMutations} call when a failure has happened. */
     static final class FailedRenderResult implements RenderResult {
         @Override
@@ -239,12 +252,13 @@
         @NonNull
         @Override
         public ListenableFuture<Void> postInflate(
-                @NonNull ViewGroup parent,
+                @NonNull ViewGroup attachParent,
                 @Nullable ViewGroup prevInflateParent,
                 boolean isReattaching) {
             return Futures.immediateVoidFuture();
         }
     }
+
     /**
      * Result of a {@link #renderOrComputeMutations} call when the layout has been inflated into a
      * new parent.
@@ -265,17 +279,17 @@
         @Override
         @UiThread
         public ListenableFuture<Void> postInflate(
-                @NonNull ViewGroup parent,
+                @NonNull ViewGroup attachParent,
                 @Nullable ViewGroup prevInflateParent,
                 boolean isReattaching) {
             InflateResult inflateResult =
                     checkNotNull(
                             mNewInflateParentData.mInflateResult,
                             TAG
-                                    + " - inflated result was null, but inflating into new parent"
-                                    + " requested.");
-            parent.removeAllViews();
-            parent.addView(
+                                    + " - inflated result was null, but inflating into new"
+                                    + " attachParent requested.");
+            attachParent.removeAllViews();
+            attachParent.addView(
                     inflateResult.inflateParent, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
             inflateResult.updateDynamicDataPipeline(isReattaching);
             return Futures.immediateVoidFuture();
@@ -305,7 +319,7 @@
         @Override
         @UiThread
         public ListenableFuture<Void> postInflate(
-                @NonNull ViewGroup parent,
+                @NonNull ViewGroup attachParent,
                 @Nullable ViewGroup prevInflateParent,
                 boolean isReattaching) {
             return mInflater.applyMutation(checkNotNull(prevInflateParent), mMutation);
@@ -329,6 +343,8 @@
         @NonNull private final ListeningExecutorService mBgExecutorService;
         @Nullable private final ProtoLayoutExtensionViewProvider mExtensionViewProvider;
         @NonNull private final String mClickableIdExtra;
+
+        @Nullable private final LoggingUtils mLoggingUtils;
         private final boolean mAnimationEnabled;
         private final int mRunningAnimationsLimit;
 
@@ -349,6 +365,7 @@
                 @NonNull ListeningExecutorService bgExecutorService,
                 @Nullable ProtoLayoutExtensionViewProvider extensionViewProvider,
                 @NonNull String clickableIdExtra,
+                @Nullable LoggingUtils loggingUtils,
                 boolean animationEnabled,
                 int runningAnimationsLimit,
                 boolean updatesEnabled,
@@ -366,6 +383,7 @@
             this.mBgExecutorService = bgExecutorService;
             this.mExtensionViewProvider = extensionViewProvider;
             this.mClickableIdExtra = clickableIdExtra;
+            this.mLoggingUtils = loggingUtils;
             this.mAnimationEnabled = animationEnabled;
             this.mRunningAnimationsLimit = runningAnimationsLimit;
             this.mUpdatesEnabled = updatesEnabled;
@@ -444,6 +462,12 @@
             return mClickableIdExtra;
         }
 
+        /** Returns the debug logger. */
+        @Nullable
+        public LoggingUtils getLoggingUtils() {
+            return mLoggingUtils;
+        }
+
         /** Returns whether animations are enabled. */
         @RestrictTo(Scope.LIBRARY)
         public boolean getAnimationEnabled() {
@@ -504,6 +528,7 @@
             @NonNull private final ListeningExecutorService mBgExecutorService;
             @Nullable private ProtoLayoutExtensionViewProvider mExtensionViewProvider;
             @NonNull private final String mClickableIdExtra;
+            @Nullable private LoggingUtils mLoggingUtils;
             private boolean mAnimationEnabled = true;
             private int mRunningAnimationsLimit = DEFAULT_MAX_CONCURRENT_RUNNING_ANIMATIONS;
 
@@ -599,6 +624,14 @@
                 return this;
             }
 
+            /** Sets the debug logger. */
+            @RestrictTo(Scope.LIBRARY)
+            @NonNull
+            public Builder setLoggingUtils(@NonNull LoggingUtils loggingUitls) {
+                this.mLoggingUtils = loggingUitls;
+                return this;
+            }
+
             /**
              * Sets whether animation are enabled. If disabled, none of the animation will be
              * played.
@@ -694,6 +727,7 @@
                         mBgExecutorService,
                         mExtensionViewProvider,
                         mClickableIdExtra,
+                        mLoggingUtils,
                         mAnimationEnabled,
                         mRunningAnimationsLimit,
                         mUpdatesEnabled,
@@ -715,6 +749,7 @@
         this.mExtensionViewProvider = config.getExtensionViewProvider();
         this.mAnimationEnabled = config.getAnimationEnabled();
         this.mClickableIdExtra = config.getClickableIdExtra();
+        this.mLoggingUtils = config.getLoggingUtils();
         this.mAdaptiveUpdateRatesEnabled = config.getAdaptiveUpdateRatesEnabled();
         this.mWasFullyVisibleBefore = false;
         this.mAllowLayoutChangingBindsWithoutDefault =
@@ -728,8 +763,7 @@
                                     config.getPlatformDataProviders(),
                                     stateStore,
                                     new FixedQuotaManagerImpl(
-                                            config.getRunningAnimationsLimit(),
-                                            "animations"),
+                                            config.getRunningAnimationsLimit(), "animations"),
                                     new FixedQuotaManagerImpl(
                                             DYNAMIC_NODES_MAX_COUNT, "dynamic nodes"))
                             : new ProtoLayoutDynamicDataPipeline(
@@ -780,7 +814,8 @@
                         .setAnimationEnabled(mAnimationEnabled)
                         .setClickableIdExtra(mClickableIdExtra)
                         .setAllowLayoutChangingBindsWithoutDefault(
-                                mAllowLayoutChangingBindsWithoutDefault);
+                                mAllowLayoutChangingBindsWithoutDefault)
+                        .setApplyFontVariantBodyAsDefault(true);
         if (mDataPipeline != null) {
             inflaterConfigBuilder.setDynamicDataPipeline(mDataPipeline);
         }
@@ -789,6 +824,10 @@
             inflaterConfigBuilder.setExtensionViewProvider(mExtensionViewProvider);
         }
 
+        if (mLoggingUtils != null) {
+            inflaterConfigBuilder.setLoggingUtils(mLoggingUtils);
+        }
+
         ProtoLayoutInflater inflater = new ProtoLayoutInflater(inflaterConfigBuilder.build());
 
         // mark the view and skip doing diff update (to avoid doubling the work each time).
@@ -848,18 +887,17 @@
     }
 
     /**
-     * Render the layout for this layout and attach this layout instance to a parent container. Note
-     * that this method may clear all of {@code parent}'s children before attaching the layout, but
-     * only if it's not possible to update them in place.
+     * Render the layout for this layout and attach this layout instance to a {@code attachParent}
+     * container. Note that this method may clear all of {@code attachParent}'s children before
+     * attaching the layout, but only if it's not possible to update them in place.
      *
-     * <p>If the layout has not yet been inflated, it will not be attached to the parent container
-     * immediately (nor will it remove all of {@code parent}'s children); it will instead inflate
-     * the layout in the background, then attach it at some point in the future once it has been
-     * inflated.
+     * <p>If the layout has not yet been inflated, it will not be attached to the {@code
+     * attachParent} container immediately; it will instead inflate the layout in the background,
+     * then attach it at some point in the future once it has been inflated.
      *
      * <p>Note that it is safe to call {@link ProtoLayoutViewInstance#detach}, and subsequently,
-     * attach again while the layout is inflating; it will only attach to the last requested parent
-     * (or if detach was the last call, it will not be attached to anything).
+     * attach again while the layout is inflating; it will only attach to the last requested {@code
+     * attachParent} (or if detach was the last call, it will not be attached to anything).
      *
      * <p>Note also that this method must be called from the UI thread;
      */
@@ -872,15 +910,21 @@
     public ListenableFuture<Void> renderAndAttach(
             @NonNull Layout layout,
             @NonNull ResourceProto.Resources resources,
-            @NonNull ViewGroup parent) {
+            @NonNull ViewGroup attachParent) {
+        if (mLoggingUtils != null && mLoggingUtils.canLogD(TAG)) {
+            mLoggingUtils.logD(TAG, "Layout received in #renderAndAttach:\n %s", layout.toString());
+            mLoggingUtils.logD(
+                    TAG, "Resources received in #renderAndAttach:\n %s", resources.toString());
+        }
+
         if (mAttachParent == null) {
-            mAttachParent = parent;
+            mAttachParent = attachParent;
             mAttachParent.removeAllViews();
             // Preload it with the previous layout if we have one.
             if (mInflateParent != null) {
                 mAttachParent.addView(mInflateParent);
             }
-        } else if (mAttachParent != parent) {
+        } else if (mAttachParent != attachParent) {
             throw new IllegalStateException("ProtoLayoutViewInstance is already attached!");
         }
 
@@ -892,10 +936,11 @@
         boolean isReattaching = false;
         if (mRenderFuture != null) {
             if (!mRenderFuture.isDone()) {
-                // There is an ongoing rendering operation. We'll skip this request as a missed
-                // frame.
-                Log.w(TAG, "Skipped layout update: previous layout update hasn't finished yet.");
-                return Futures.immediateCancelledFuture();
+                // There is an ongoing rendering operation. Cancel that and render the new layout.
+                Log.w(TAG, "Cancelling the previous layout update that hasn't finished yet.");
+                checkNotNull(mRenderFuture).cancel(/* maybeInterruptIfRunning= */ false);
+
+                mRenderFuture = null;
             } else if (layout == mPrevLayout && mCanReattachWithoutRendering) {
                 isReattaching = true;
             } else {
@@ -903,15 +948,24 @@
             }
         }
 
-        @Nullable ViewGroup prevInflateParent = getOnlyChildViewGroup(mAttachParent);
-        @Nullable
-        RenderedMetadata prevRenderedMetadata =
-                prevInflateParent != null
-                        ? ProtoLayoutInflater.getRenderedMetadata(prevInflateParent)
-                        : null;
+        @Nullable ViewGroup prevInflateParent = getOnlyChildViewGroup(attachParent);
 
         if (mRenderFuture == null) {
+            if (prevInflateParent != null
+                    && !Objects.equals(resources.getVersion(), mPrevResourcesVersion)) {
+                // If the resource version has changed, clear the diff metadata to force a full
+                // reinflation.
+                ProtoLayoutInflater.clearRenderedMetadata(checkNotNull(prevInflateParent));
+            }
+
+            @Nullable
+            RenderedMetadata prevRenderedMetadata =
+                    prevInflateParent != null
+                            ? ProtoLayoutInflater.getRenderedMetadata(prevInflateParent)
+                            : null;
+
             mPrevLayout = layout;
+            mPrevResourcesVersion = resources.getVersion();
 
             int gravity = UNSPECIFIED_GRAVITY;
             LayoutParams layoutParams = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
@@ -929,7 +983,7 @@
 
             ViewProperties parentViewProp =
                     ViewProperties.fromViewGroup(
-                            parent,
+                            attachParent,
                             layoutParams,
                             // We need this specific ones as otherwise gravity gets lost for
                             // attachParent node.
@@ -937,24 +991,32 @@
 
             mRenderFuture =
                     mBgExecutorService.submit(
-                            () -> renderOrComputeMutations(
-                                layout, resources, prevRenderedMetadata, parentViewProp));
+                            () ->
+                                    renderOrComputeMutations(
+                                            layout,
+                                            resources,
+                                            prevRenderedMetadata,
+                                            parentViewProp));
             mCanReattachWithoutRendering = false;
         }
         SettableFuture<Void> result = SettableFuture.create();
         if (!checkNotNull(mRenderFuture).isDone()) {
+            ListenableFuture<RenderResult> rendererFuture = mRenderFuture;
             mRenderFuture.addListener(
                     () -> {
-                        // Ensure that this inflater is attached to the same parent as when this
-                        // listener was created. If not, something has re-attached us in the time it
-                        // took for the inflater to execute.
-                        if (mAttachParent == parent) {
+                        if (rendererFuture.isCancelled()) {
+                            result.cancel(/* mayInterruptIfRunning= */ false);
+                        }
+                        // Ensure that this inflater is attached to the same attachParent as when
+                        // this listener was created. If not, something has re-attached us in the
+                        // time it took for the inflater to execute.
+                        if (mAttachParent == attachParent) {
                             try {
                                 result.setFuture(
                                         postInflate(
-                                                parent,
+                                                attachParent,
                                                 prevInflateParent,
-                                                checkNotNull(mRenderFuture).get(),
+                                                checkNotNull(rendererFuture).get(),
                                                 /* isReattaching= */ false,
                                                 layout,
                                                 resources));
@@ -968,7 +1030,7 @@
                             Log.w(
                                     TAG,
                                     "Layout is rendered, but inflater is no longer attached to the"
-                                            + " same parent. Cancelling inflation.");
+                                            + " same attachParent. Cancelling inflation.");
                             result.cancel(/* mayInterruptIfRunning= */ false);
                         }
                     },
@@ -977,7 +1039,7 @@
             try {
                 result.setFuture(
                         postInflate(
-                                parent,
+                                attachParent,
                                 prevInflateParent,
                                 mRenderFuture.get(),
                                 isReattaching,
@@ -991,6 +1053,15 @@
         return result;
     }
 
+    /**
+     * Notifies that the future calls to {@link #renderAndAttach(Layout, ResourceProto.Resources,
+     * ViewGroup)} will have a different versioning for layouts and resources. So any cached
+     * rendered result should be cleared.
+     */
+    public void invalidateCache() {
+        mPrevResourcesVersion = null;
+    }
+
     @Nullable
     private static ViewGroup getOnlyChildViewGroup(@NonNull ViewGroup parent) {
         if (parent.getChildCount() == 1) {
@@ -1006,7 +1077,7 @@
     @SuppressWarnings("ExecutorTaskName")
     @NonNull
     private ListenableFuture<Void> postInflate(
-            @NonNull ViewGroup parent,
+            @NonNull ViewGroup attachParent,
             @Nullable ViewGroup prevInflateParent,
             @NonNull RenderResult renderResult,
             boolean isReattaching,
@@ -1027,7 +1098,7 @@
         }
 
         ListenableFuture<Void> postInflateFuture =
-                renderResult.postInflate(parent, prevInflateParent, isReattaching);
+                renderResult.postInflate(attachParent, prevInflateParent, isReattaching);
         SettableFuture<Void> result = SettableFuture.create();
         if (!postInflateFuture.isDone()) {
             postInflateFuture.addListener(
@@ -1039,7 +1110,7 @@
                                 | CancellationException e) {
                             result.setFuture(
                                     handlePostInflateFailure(
-                                            e, layout, resources, prevInflateParent, parent));
+                                            e, layout, resources, prevInflateParent, attachParent));
                         }
                     },
                     mUiExecutorService);
@@ -1051,7 +1122,8 @@
                     | InterruptedException
                     | CancellationException
                     | ViewMutationException e) {
-                return handlePostInflateFailure(e, layout, resources, prevInflateParent, parent);
+                return handlePostInflateFailure(
+                        e, layout, resources, prevInflateParent, attachParent);
             }
         }
         return result;
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ContentUriValidator.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ContentUriValidator.java
index 08dbe86..39c4ea6 100644
--- a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ContentUriValidator.java
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ContentUriValidator.java
@@ -107,7 +107,7 @@
             return false;
         }
 
-        // Otherwise, only allow content from the same package that provided the tile.
+        // Otherwise, only allow content from the same package that provided the layout.
         return providerInfo.packageName.equals(mAllowedPackageName);
     }
 
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/FixedImageSpan.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/FixedImageSpan.java
new file mode 100644
index 0000000..37e0979
--- /dev/null
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/FixedImageSpan.java
@@ -0,0 +1,70 @@
+package androidx.wear.protolayout.renderer.inflater;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
+import android.text.style.ImageSpan;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import java.lang.ref.WeakReference;
+
+// Android's normal ImageSpan (well, DynamicDrawableSpan) applies baseline alignment incorrectly
+// in some cases. It incorrectly assumes that the difference between the bottom (as passed to
+// draw) and baseline of the text is always equal to the font descent, when that doesn't always
+// hold. Instead, the "y" parameter is the Y coordinate of the baseline, so base the baseline
+// alignment on that rather than "bottom".
+class FixedImageSpan extends ImageSpan {
+  @Nullable private WeakReference<Drawable> mDrawableRef;
+
+  FixedImageSpan(@NonNull Drawable drawable) {
+    super(drawable);
+  }
+
+  FixedImageSpan(@NonNull Drawable drawable, int verticalAlignment) {
+    super(drawable, verticalAlignment);
+  }
+
+  @Override
+  public void draw(
+      @NonNull Canvas canvas,
+      CharSequence text,
+      int start,
+      int end,
+      float x,
+      int top,
+      int y,
+      int bottom,
+      @NonNull Paint paint) {
+    Drawable b = getCachedDrawable();
+    canvas.save();
+
+    int transY = bottom - b.getBounds().bottom;
+    if (mVerticalAlignment == ALIGN_BASELINE) {
+      transY = y - b.getBounds().bottom;
+    } else if (mVerticalAlignment == ALIGN_CENTER) {
+      transY = (bottom - top) / 2 - b.getBounds().height() / 2;
+    }
+
+    canvas.translate(x, transY);
+    b.draw(canvas);
+    canvas.restore();
+  }
+
+  @VisibleForTesting
+  Drawable getCachedDrawable() {
+    WeakReference<Drawable> wr = mDrawableRef;
+    Drawable d = null;
+
+    if (wr != null) {
+      d = wr.get();
+    }
+
+    if (d == null) {
+      d = getDrawable();
+      mDrawableRef = new WeakReference<>(d);
+    }
+
+    return d;
+  }
+}
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflater.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflater.java
index be80bf6..00bb2ab 100644
--- a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflater.java
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflater.java
@@ -16,6 +16,8 @@
 
 package androidx.wear.protolayout.renderer.inflater;
 
+import static android.util.TypedValue.COMPLEX_UNIT_SP;
+
 import static androidx.core.util.Preconditions.checkNotNull;
 import static androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer.FIRST_CHILD_INDEX;
 import static androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer.ROOT_NODE_ID;
@@ -34,9 +36,7 @@
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.content.res.Resources.Theme;
-import android.graphics.Canvas;
 import android.graphics.Color;
-import android.graphics.Paint;
 import android.graphics.Paint.Cap;
 import android.graphics.PorterDuff.Mode;
 import android.graphics.Rect;
@@ -55,7 +55,6 @@
 import android.text.style.ClickableSpan;
 import android.text.style.ForegroundColorSpan;
 import android.text.style.ImageSpan;
-import android.text.style.MetricAffectingSpan;
 import android.text.style.StyleSpan;
 import android.text.style.UnderlineSpan;
 import android.util.Log;
@@ -166,6 +165,7 @@
 import androidx.wear.protolayout.renderer.ProtoLayoutTheme;
 import androidx.wear.protolayout.renderer.ProtoLayoutTheme.FontSet;
 import androidx.wear.protolayout.renderer.R;
+import androidx.wear.protolayout.renderer.common.LoggingUtils;
 import androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer;
 import androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer.LayoutDiff;
 import androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer.TreeNodeWithChange;
@@ -182,7 +182,6 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
-import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -248,6 +247,8 @@
 
     private static final int TEXT_COLOR_DEFAULT = 0xFFFFFFFF;
     private static final int TEXT_MAX_LINES_DEFAULT = 1;
+    @VisibleForTesting
+    static final int TEXT_AUTOSIZES_LIMIT = 10;
     private static final int TEXT_MIN_LINES = 1;
 
     private static final ContainerDimension CONTAINER_DIMENSION_DEFAULT =
@@ -279,6 +280,8 @@
     private final boolean mAllowLayoutChangingBindsWithoutDefault;
     final String mClickableIdExtra;
 
+    @Nullable private final LoggingUtils mLoggingUtils;
+
     @Nullable final Executor mLoadActionExecutor;
     final LoadActionListener mLoadActionListener;
     final boolean mAnimationEnabled;
@@ -487,6 +490,8 @@
 
     /** Config class for ProtoLayoutInflater */
     public static final class Config {
+        public static final String DEFAULT_CLICKABLE_ID_EXTRA =
+                "androidx.wear.protolayout.extra.CLICKABLE_ID";
         @NonNull private final Context mUiContext;
         @NonNull private final Layout mLayout;
         @NonNull private final ResourceResolvers mLayoutResourceResolvers;
@@ -496,8 +501,11 @@
         @NonNull private final ProtoLayoutTheme mProtoLayoutTheme;
         @Nullable private final ProtoLayoutDynamicDataPipeline mDataPipeline;
         @NonNull private final String mClickableIdExtra;
+
+        @Nullable private final LoggingUtils mLoggingUtils;
         @Nullable private final ProtoLayoutExtensionViewProvider mExtensionViewProvider;
         private final boolean mAnimationEnabled;
+
         private final boolean mAllowLayoutChangingBindsWithoutDefault;
 
         private final boolean mApplyFontVarianBodyAsDefault;
@@ -513,6 +521,7 @@
                 @Nullable ProtoLayoutDynamicDataPipeline dataPipeline,
                 @Nullable ProtoLayoutExtensionViewProvider extensionViewProvider,
                 @NonNull String clickableIdExtra,
+                @Nullable LoggingUtils loggingUtils,
                 boolean animationEnabled,
                 boolean allowLayoutChangingBindsWithoutDefault,
                 boolean applyFontVarianBodyAsDefault) {
@@ -527,6 +536,7 @@
             this.mAnimationEnabled = animationEnabled;
             this.mAllowLayoutChangingBindsWithoutDefault = allowLayoutChangingBindsWithoutDefault;
             this.mClickableIdExtra = clickableIdExtra;
+            this.mLoggingUtils = loggingUtils;
             this.mExtensionViewProvider = extensionViewProvider;
             this.mApplyFontVarianBodyAsDefault = applyFontVarianBodyAsDefault;
         }
@@ -588,12 +598,21 @@
             return mDataPipeline;
         }
 
-        /** ID for the Intent extra containing the ID of a Clickable. */
+        /**
+         * ID for the Intent extra containing the ID of a Clickable. Defaults to {@link
+         * Config#DEFAULT_CLICKABLE_ID_EXTRA} if not specified.
+         */
         @NonNull
         public String getClickableIdExtra() {
             return mClickableIdExtra;
         }
 
+        /** Debug logger used to log debug messages. */
+        @Nullable
+        public LoggingUtils getLoggingUtils() {
+            return mLoggingUtils;
+        }
+
         /** View provider for the renderer extension. */
         @Nullable
         public ProtoLayoutExtensionViewProvider getExtensionViewProvider() {
@@ -633,6 +652,8 @@
             private boolean mAllowLayoutChangingBindsWithoutDefault = false;
             @Nullable private String mClickableIdExtra;
 
+            @Nullable private LoggingUtils mLoggingUtils;
+
             @Nullable private ProtoLayoutExtensionViewProvider mExtensionViewProvider = null;
 
             private boolean mApplyFontVariantBodyAsDefault = false;
@@ -725,17 +746,30 @@
                 return this;
             }
 
-            /** Sets the ID for the Intent extra containing the ID of a Clickable. */
+            /**
+             * Sets the ID for the Intent extra containing the ID of a Clickable. Defaults to {@link
+             * Config#DEFAULT_CLICKABLE_ID_EXTRA} if not specified.
+             */
             @NonNull
             public Builder setClickableIdExtra(@NonNull String clickableIdExtra) {
                 this.mClickableIdExtra = clickableIdExtra;
                 return this;
             }
 
+            /** Sets the debug logger used for extensive logging. */
+            @NonNull
+            public Builder setLoggingUtils(@NonNull LoggingUtils loggingUtils) {
+                this.mLoggingUtils = loggingUtils;
+                return this;
+            }
+
             /**
              * Sets whether a "layout changing" data bind can be applied without the
-             * "value_for_layout" field being filled in. This is to support legacy apps which use
-             * layout-changing data binds before the full support was built. Defaults to false.
+             * "value_for_layout" field being filled in, or being set to zero / empty. Defaults to
+             * false.
+             *
+             * <p>This is to support legacy apps which use layout-changing data bind before the full
+             * support was built.
              */
             @NonNull
             public Builder setAllowLayoutChangingBindsWithoutDefault(
@@ -772,6 +806,10 @@
                     this.mProtoLayoutTheme = ProtoLayoutThemeImpl.defaultTheme(mUiContext);
                 }
 
+                if (mClickableIdExtra == null) {
+                    mClickableIdExtra = DEFAULT_CLICKABLE_ID_EXTRA;
+                }
+
                 return new Config(
                         mUiContext,
                         mLayout,
@@ -783,6 +821,7 @@
                         mDataPipeline,
                         mExtensionViewProvider,
                         checkNotNull(mClickableIdExtra),
+                        mLoggingUtils,
                         mAnimationEnabled,
                         mAllowLayoutChangingBindsWithoutDefault,
                         mApplyFontVariantBodyAsDefault);
@@ -808,6 +847,7 @@
         this.mAllowLayoutChangingBindsWithoutDefault =
                 config.getAllowLayoutChangingBindsWithoutDefault();
         this.mClickableIdExtra = config.getClickableIdExtra();
+        this.mLoggingUtils = config.getLoggingUtils();
         this.mExtensionViewProvider = config.getExtensionViewProvider();
         this.mApplyFontVariantBodyAsDefault = config.getApplyFontVariantBodyAsDefault();
     }
@@ -1099,10 +1139,6 @@
         return Typeface.create(fontStyleToTypeface(fontStyle), fontStyleToTypefaceStyle(fontStyle));
     }
 
-    private static MetricAffectingSpan createTypefaceSpan(FontStyle fontStyle) {
-        return new StyleSpan(fontStyleToTypefaceStyle(fontStyle));
-    }
-
     /**
      * Returns whether or not the default style bits in Typeface can be used, or if we need to add
      * bold/italic flags there.
@@ -1113,7 +1149,7 @@
 
     private float toPx(SpProp spField) {
         return TypedValue.applyDimension(
-                TypedValue.COMPLEX_UNIT_SP,
+                COMPLEX_UNIT_SP,
                 spField.getValue(),
                 mUiContext.getResources().getDisplayMetrics());
     }
@@ -1122,7 +1158,8 @@
             FontStyle style,
             TextView textView,
             String posId,
-            Optional<ProtoLayoutDynamicDataPipeline.PipelineMaker> pipelineMaker) {
+            Optional<ProtoLayoutDynamicDataPipeline.PipelineMaker> pipelineMaker,
+            boolean isAutoSizeAllowed) {
         // Note: Underline must be applied as a Span to work correctly (as opposed to using
         // TextPaint#setTextUnderline). This is applied in the caller instead.
 
@@ -1131,8 +1168,43 @@
         // flags in Paint if they're not supported by the given typeface).
         textView.setTypeface(createTypeface(style), fontStyleToTypefaceStyle(style));
 
-        if (style.hasSize()) {
-            textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, style.getSize().getValue());
+        if (fontStyleHasSize(style)) {
+            List<SpProp> sizes = style.getSizeList();
+            int sizesCnt = sizes.size();
+
+            if (sizesCnt == 1) {
+                // No autosizing needed.
+                textView.setTextSize(COMPLEX_UNIT_SP, sizes.get(0).getValue());
+            } else if (isAutoSizeAllowed && sizesCnt <= TEXT_AUTOSIZES_LIMIT) {
+                // Max size is needed so that TextView leaves enough space for it. Otherwise,
+                // the text won't be able to grow.
+                int maxSize =
+                        sizes.stream().mapToInt(sp -> (int) sp.getValue()).max().getAsInt();
+                textView.setTextSize(COMPLEX_UNIT_SP, maxSize);
+
+                // No need for sorting, TextView does that.
+                textView.setAutoSizeTextTypeUniformWithPresetSizes(
+                        sizes.stream().mapToInt(spProp -> (int) spProp.getValue()).toArray(),
+                        COMPLEX_UNIT_SP);
+            } else {
+                // Fallback where multiple values can't be used and the last value would be used.
+                // This can happen in two cases.
+                if (!isAutoSizeAllowed) {
+                    // There is more than 1 size specified, but autosizing is not allowed.
+                    Log.w(
+                            TAG,
+                            "Trying to autosize text with multiple font sizes where it's not "
+                                    + "allowed. Ignoring all other sizes and using the last one.");
+                } else {
+                    Log.w(
+                            TAG,
+                            "More than " + TEXT_AUTOSIZES_LIMIT + " sizes has been added for the "
+                                    + "text autosizing. Ignoring values after the "
+                                    + TEXT_AUTOSIZES_LIMIT + " one.");
+                }
+
+                textView.setTextSize(COMPLEX_UNIT_SP, sizes.get(sizesCnt - 1).getValue());
+            }
         }
 
         if (style.hasLetterSpacing()) {
@@ -1152,10 +1224,16 @@
         // flags in Paint if they're not supported by the given typeface).
         textView.setTypeface(createTypeface(style), fontStyleToTypefaceStyle(style));
 
-        // underline. We can implement this later by drawing a line under the text ourselves though.
-
-        if (style.hasSize()) {
-            textView.setTextSize(toPx(style.getSize()));
+        if (fontStyleHasSize(style)) {
+            // We are using the last added size in the FontStyle because ArcText doesn't support
+            // autosizing. This is the same behaviour as it was before size has made repeated.
+            if (style.getSizeList().size() > 1) {
+                Log.w(
+                        TAG,
+                        "Font size with multiple values has been used on Arc Text. Ignoring "
+                                + "all size except the first one.");
+            }
+            textView.setTextSize(toPx(style.getSize(style.getSizeCount() - 1)));
         }
     }
 
@@ -1197,13 +1275,19 @@
                         v ->
                                 checkNotNull(mLoadActionExecutor)
                                         .execute(
-                                                () ->
-                                                        mLoadActionListener.onClick(
-                                                                buildState(
-                                                                        clickable
-                                                                                .getOnClick()
-                                                                                .getLoadAction(),
-                                                                        clickable.getId()))));
+                                                () -> {
+                                                    Log.d(
+                                                            TAG,
+                                                            "Executing LoadAction listener"
+                                                                    + " with clickable id: "
+                                                                    + clickable.getId());
+                                                    mLoadActionListener.onClick(
+                                                            buildState(
+                                                                    clickable
+                                                                            .getOnClick()
+                                                                            .getLoadAction(),
+                                                                    clickable.getId()));
+                                                }));
                 break;
             case VALUE_NOT_SET:
                 break;
@@ -1952,7 +2036,7 @@
                     Log.w(
                             TAG,
                             "Spacer width's value_for_layout is not a positive value. Element won't"
-                                + " be visible.");
+                                    + " be visible.");
                 }
                 spaceWrapperLayoutParams.width = safeDpToPx(widthForLayoutDp);
             }
@@ -1962,7 +2046,7 @@
                     Log.w(
                             TAG,
                             "Spacer height's value_for_layout is not a positive value. Element"
-                                + " won't be visible.");
+                                    + " won't be visible.");
                 }
                 spaceWrapperLayoutParams.height = safeDpToPx(heightForLayoutDp);
             }
@@ -2192,8 +2276,8 @@
 
         @Nullable String valueForLayout = resolveValueForLayoutIfNeeded(text.getText());
 
-        // Use valueForLayout as a proxy for "has a dynamic size". If there's a dynamic binding
-        // for the text element, then it can only have a single line of text.
+        // Use valueForLayout as a proxy for "has a dynamic size". If there's a dynamic binding for
+        // the text element, then it can only have a single line of text.
         if (text.hasMaxLines() && valueForLayout == null) {
             textView.setMaxLines(max(TEXT_MIN_LINES, text.getMaxLines().getValue()));
         } else {
@@ -2201,12 +2285,24 @@
         }
         applyTextOverflow(textView, text.getOverflow(), text.getMarqueeParameters());
 
+        // Text auto size is not supported for dynamic text.
+        boolean isAutoSizeAllowed = !(text.hasText() && text.getText().hasDynamicValue());
         // Setting colours **must** go after setting the Text Appearance, otherwise it will get
         // immediately overridden.
         if (text.hasFontStyle()) {
-            applyFontStyle(text.getFontStyle(), textView, posId, pipelineMaker);
+            applyFontStyle(
+                    text.getFontStyle(),
+                    textView,
+                    posId,
+                    pipelineMaker,
+                    isAutoSizeAllowed);
         } else {
-            applyFontStyle(FontStyle.getDefaultInstance(), textView, posId, pipelineMaker);
+            applyFontStyle(
+                    FontStyle.getDefaultInstance(),
+                    textView,
+                    posId,
+                    pipelineMaker,
+                    isAutoSizeAllowed);
         }
 
         boolean excludeFontPadding = false;
@@ -2697,7 +2793,7 @@
                 Log.w(
                         TAG,
                         "ArcLine length's value_for_layout is not a positive value. Element won't"
-                            + " be visible.");
+                                + " be visible.");
             }
             sizeWrapper.setSweepAngleDegrees(sizeForLayout);
             sizedLp.setAngularAlignment(
@@ -2804,8 +2900,17 @@
 
     private void applyStylesToSpan(
             SpannableStringBuilder builder, int start, int end, FontStyle fontStyle) {
-        if (fontStyle.hasSize()) {
-            AbsoluteSizeSpan span = new AbsoluteSizeSpan(round(toPx(fontStyle.getSize())));
+        if (fontStyleHasSize(fontStyle)) {
+            // We are using the last added size in the FontStyle because ArcText doesn't support
+            // autosizing. This is the same behaviour as it was before size has made repeated.
+            if (fontStyle.getSizeList().size() > 1) {
+                Log.w(
+                        TAG,
+                        "Font size with multiple values has been used on Span Text. Ignoring "
+                        + "all size except the first one.");
+            }
+            AbsoluteSizeSpan span = new AbsoluteSizeSpan(round(toPx(
+                    fontStyle.getSize(fontStyle.getSizeCount() - 1))));
             builder.setSpan(span, start, end, Spanned.SPAN_MARK_MARK);
         }
 
@@ -2815,7 +2920,7 @@
         }
 
         if (!hasDefaultTypefaceStyle(fontStyle)) {
-            MetricAffectingSpan span = createTypefaceSpan(fontStyle);
+            StyleSpan span = new StyleSpan(fontStyleToTypefaceStyle(fontStyle));
             builder.setSpan(span, start, end, Spanned.SPAN_MARK_MARK);
         }
 
@@ -2834,6 +2939,10 @@
         builder.setSpan(colorSpan, start, end, Spanned.SPAN_MARK_MARK);
     }
 
+    private static boolean fontStyleHasSize(FontStyle fontStyle) {
+        return !fontStyle.getSizeList().isEmpty();
+    }
+
     private void applyModifiersToSpan(
             SpannableStringBuilder builder, int start, int end, SpanModifiers modifiers) {
         if (modifiers.hasClickable()) {
@@ -2978,7 +3087,12 @@
         // Setting colours **must** go after setting the Text Appearance, otherwise it will get
         // immediately overridden.
         if (mApplyFontVariantBodyAsDefault) {
-            applyFontStyle(FontStyle.getDefaultInstance(), tv, posId, pipelineMaker);
+            applyFontStyle(
+                    FontStyle.getDefaultInstance(),
+                    tv,
+                    posId,
+                    pipelineMaker,
+                    /* isAutoSizeAllowed= */ false);
         }
 
         LayoutParams layoutParams = generateDefaultLayoutParams();
@@ -3602,9 +3716,9 @@
     }
 
     /**
-     * Inflates a ProtoLayout into {@code parent}.
+     * Inflates a ProtoLayout into {@code inflateParent}.
      *
-     * @param parent The view to attach the layout into.
+     * @param inflateParent The view to attach the layout into.
      * @return The {@link InflateResult} class containing the first child that was inflated,
      *     animations to be played, and new nodes for the dynamic data pipeline. Callers should use
      *     {@link InflateResult#updateDynamicDataPipeline} to apply those changes using a UI Thread.
@@ -3612,7 +3726,7 @@
      *     or the top-level LayoutElement contains an unsupported inner type.
      */
     @Nullable
-    public InflateResult inflate(@NonNull ViewGroup parent) {
+    public InflateResult inflate(@NonNull ViewGroup inflateParent) {
 
         // This is a full re-inflation, so we don't need any previous rendering information.
         LayoutInfo.Builder layoutInfoBuilder =
@@ -3628,7 +3742,7 @@
         InflatedView firstInflatedChild =
                 inflateLayoutElement(
                         new ParentViewWrapper(
-                                parent,
+                                inflateParent,
                                 new LayoutParams(
                                         LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)),
                         mLayoutProto.getRoot(),
@@ -3640,11 +3754,11 @@
             return null;
         }
         if (mLayoutProto.hasFingerprint()) {
-            parent.setTag(
+            inflateParent.setTag(
                     R.id.rendered_metadata_tag,
                     new RenderedMetadata(mLayoutProto.getFingerprint(), layoutInfoBuilder.build()));
         }
-        return new InflateResult(parent, firstInflatedChild.mView, pipelineMaker);
+        return new InflateResult(inflateParent, firstInflatedChild.mView, pipelineMaker);
     }
 
     /**
@@ -3680,6 +3794,8 @@
             return null;
         }
 
+        logDebug(diff);
+
         List<InflatedView> inflatedViews = new ArrayList<>();
         LayoutInfo.Builder layoutInfoBuilder =
                 new LayoutInfo.Builder(prevRenderedMetadata.getLayoutInfo());
@@ -3770,8 +3886,8 @@
     @UiThread
     @NonNull
     public ListenableFuture<Void> applyMutation(
-            @NonNull ViewGroup parent, @NonNull ViewGroupMutation groupMutation) {
-        RenderedMetadata prevRenderedMetadata = getRenderedMetadata(parent);
+            @NonNull ViewGroup prevInflatedParent, @NonNull ViewGroupMutation groupMutation) {
+        RenderedMetadata prevRenderedMetadata = getRenderedMetadata(prevInflatedParent);
         if (prevRenderedMetadata != null
                 && !ProtoLayoutDiffer.areNodesEquivalent(
                         prevRenderedMetadata.getTreeFingerprint().getRoot(),
@@ -3791,11 +3907,11 @@
                     .mPipelineMaker
                     .get()
                     .playExitAnimations(
-                            parent,
+                            prevInflatedParent,
                             /* isReattaching= */ false,
                             () -> {
                                 try {
-                                    applyMutationInternal(parent, groupMutation);
+                                    applyMutationInternal(prevInflatedParent, groupMutation);
                                     result.set(null);
                                 } catch (ViewMutationException ex) {
                                     result.setException(ex);
@@ -3804,7 +3920,7 @@
             return result;
         } else {
             try {
-                applyMutationInternal(parent, groupMutation);
+                applyMutationInternal(prevInflatedParent, groupMutation);
                 return immediateVoidFuture();
             } catch (ViewMutationException ex) {
                 return immediateFailedFuture(ex);
@@ -3813,14 +3929,14 @@
     }
 
     private void applyMutationInternal(
-            @NonNull ViewGroup parent, @NonNull ViewGroupMutation groupMutation) {
+            @NonNull ViewGroup prevInflatedParent, @NonNull ViewGroupMutation groupMutation) {
         for (InflatedView inflatedView : groupMutation.mInflatedViews) {
             String posId = inflatedView.getTag();
             if (posId == null) {
                 // Failed to apply the mutation. Need to update fully.
                 throw new ViewMutationException("View has no tag");
             }
-            View viewToUpdate = parent.findViewWithTag(posId);
+            View viewToUpdate = prevInflatedParent.findViewWithTag(posId);
             if (viewToUpdate == null) {
                 // Failed to apply the mutation. Need to update fully.
                 throw new ViewMutationException("Can't find view " + posId);
@@ -3853,8 +3969,9 @@
             }
         }
         groupMutation.mPipelineMaker.ifPresent(
-                pipe -> pipe.commit(parent, /* isReattaching= */ false));
-        parent.setTag(R.id.rendered_metadata_tag, groupMutation.mRenderedMetadataAfterMutation);
+                pipe -> pipe.commit(prevInflatedParent, /* isReattaching= */ false));
+        prevInflatedParent.setTag(
+                R.id.rendered_metadata_tag, groupMutation.mRenderedMetadataAfterMutation);
     }
 
     /** Returns the {@link RenderedMetadata} attached to {@code inflateParent}. */
@@ -3975,6 +4092,37 @@
                 mProtoLayoutTheme.getFallbackTextAppearanceResId());
     }
 
+    private void logDebug(LayoutDiff diff) {
+        if (mLoggingUtils != null && mLoggingUtils.canLogD(TAG)) {
+            StringBuilder sb =
+                    new StringBuilder("LayoutDiff result at LayoutInflater#computeMutation: \n");
+            List<TreeNodeWithChange> diffNodes = diff.getChangedNodes();
+            if (diffNodes.isEmpty()) {
+                mLoggingUtils.logD(TAG, "No diff.");
+                return;
+            }
+            for (TreeNodeWithChange changedNode : diffNodes) {
+                sb.append(formatNodeChangeForLogs(changedNode));
+                if (changedNode.getLayoutElement() != null) {
+                    sb.append(changedNode.getLayoutElement());
+                } else if (changedNode.getArcLayoutElement() != null) {
+                    sb.append(changedNode.getArcLayoutElement());
+                }
+                sb.append("\n");
+            }
+            mLoggingUtils.logD(TAG, sb.toString());
+        }
+    }
+
+    private static String formatNodeChangeForLogs(TreeNodeWithChange change) {
+        return "PosId: "
+                + change.getPosId()
+                + " | Fingerprint: "
+                + change.getFingerprint().getSelfTypeValue()
+                + " | isSelfOnlyChange: "
+                + change.isSelfOnlyChange();
+    }
+
     /** Implementation of ClickableSpan for ProtoLayout's Clickables. */
     private class ProtoLayoutClickableSpan extends ClickableSpan {
         private final Clickable mClickable;
@@ -4020,67 +4168,6 @@
         }
     }
 
-    // Android's normal ImageSpan (well, DynamicDrawableSpan) applies baseline alignment incorrectly
-    // in some cases. It incorrectly assumes that the difference between the bottom (as passed to
-    // draw) and baseline of the text is always equal to the font descent, when that doesn't always
-    // hold. Instead, the "y" parameter is the Y coordinate of the baseline, so base the baseline
-    // alignment on that rather than "bottom".
-    @VisibleForTesting
-    static class FixedImageSpan extends ImageSpan {
-        @Nullable private WeakReference<Drawable> mDrawableRef;
-
-        FixedImageSpan(@NonNull Drawable drawable) {
-            super(drawable);
-        }
-
-        FixedImageSpan(@NonNull Drawable drawable, int verticalAlignment) {
-            super(drawable, verticalAlignment);
-        }
-
-        @Override
-        public void draw(
-                @NonNull Canvas canvas,
-                CharSequence text,
-                int start,
-                int end,
-                float x,
-                int top,
-                int y,
-                int bottom,
-                @NonNull Paint paint) {
-            Drawable b = getCachedDrawable();
-            canvas.save();
-
-            int transY = bottom - b.getBounds().bottom;
-            if (mVerticalAlignment == ALIGN_BASELINE) {
-                transY = y - b.getBounds().bottom;
-            } else if (mVerticalAlignment == ALIGN_CENTER) {
-                transY = (bottom - top) / 2 - b.getBounds().height() / 2;
-            }
-
-            canvas.translate(x, transY);
-            b.draw(canvas);
-            canvas.restore();
-        }
-
-        @VisibleForTesting
-        Drawable getCachedDrawable() {
-            WeakReference<Drawable> wr = mDrawableRef;
-            Drawable d = null;
-
-            if (wr != null) {
-                d = wr.get();
-            }
-
-            if (d == null) {
-                d = getDrawable();
-                mDrawableRef = new WeakReference<>(d);
-            }
-
-            return d;
-        }
-    }
-
     /** Implementation of {@link Scroller} which inhibits all scrolling. */
     private static class InhibitingScroller extends Scroller {
         InhibitingScroller(Context context) {
diff --git a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/StandardResourceResolvers.java b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/StandardResourceResolvers.java
index b9ae624..467af71 100644
--- a/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/StandardResourceResolvers.java
+++ b/wear/protolayout/protolayout-renderer/src/main/java/androidx/wear/protolayout/renderer/inflater/StandardResourceResolvers.java
@@ -90,8 +90,7 @@
     }
 
     /**
-     * Get a builder pre-populated with resolvers for the resources of a {@link TileService}, hosted
-     * within another app on the device.
+     * Get a builder pre-populated with resolvers resources hosted within another app on the device.
      *
      * <p>Use {@code setFooAccessor} calls to change the pre-populated ones or add others.
      *
diff --git a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/common/ProtoLayoutDifferTest.java b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/common/ProtoLayoutDifferTest.java
index deb6dbc..57b5b72 100644
--- a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/common/ProtoLayoutDifferTest.java
+++ b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/common/ProtoLayoutDifferTest.java
@@ -16,7 +16,6 @@
 
 package androidx.wear.protolayout.renderer.common;
 
-import static androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer.DISCARDED_FINGERPRINT_VALUE;
 import static androidx.wear.protolayout.renderer.helper.TestDsl.arc;
 import static androidx.wear.protolayout.renderer.helper.TestDsl.arcText;
 import static androidx.wear.protolayout.renderer.helper.TestDsl.column;
@@ -29,8 +28,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.wear.protolayout.proto.FingerprintProto.NodeFingerprint;
-import androidx.wear.protolayout.proto.FingerprintProto.TreeFingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto.ArcLayoutElement;
 import androidx.wear.protolayout.proto.LayoutElementProto.Layout;
 import androidx.wear.protolayout.proto.LayoutElementProto.LayoutElement;
@@ -38,13 +35,9 @@
 import androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer.LayoutDiff;
 import androidx.wear.protolayout.renderer.common.ProtoLayoutDiffer.TreeNodeWithChange;
 
-import com.google.common.collect.ImmutableList;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.List;
-
 @RunWith(AndroidJUnit4.class)
 public class ProtoLayoutDifferTest {
     @Test
@@ -102,93 +95,6 @@
     }
 
     @Test
-    public void getChangedNodes_bothFingerprintsDiscarded_allDiffs() {
-        Layout layout =
-                layout(
-                        column( // 1
-                                row( // 1.1
-                                        text("Foo"), // 1.1.1
-                                        text("Bar") // 1.1.2
-                                        )));
-        NodeFingerprint discardedFingerPrintRoot =
-                buildShadowDiscardedFingerprint(
-                        layout.getFingerprint().getRoot(),
-                        "1",
-                        ImmutableList.of("1", "1.1", "1.1.1", "1.1.2"),
-                        ImmutableList.of("1", "1.1"));
-
-        Layout discardedFingerprintLayout =
-                Layout.newBuilder()
-                        .setRoot(layout.getRoot())
-                        .setFingerprint(
-                                TreeFingerprint.newBuilder().setRoot(discardedFingerPrintRoot))
-                        .build();
-
-        LayoutDiff diff =
-                ProtoLayoutDiffer.getDiff(
-                        discardedFingerprintLayout.getFingerprint(), discardedFingerprintLayout);
-        assertThat(diff.getChangedNodes()).hasSize(1);
-    }
-
-    @Test
-    public void getChangedNodes_selfChange_childrenUnaffected() {
-        Layout layout =
-                layout(
-                        column( // 1
-                                row( // 1.1
-                                        text("Foo"), // 1.1.1
-                                        text("Bar") // 1.1.2
-                                        )));
-        NodeFingerprint discardedFingerPrintRoot =
-                buildShadowDiscardedFingerprint(
-                        layout.getFingerprint().getRoot(),
-                        "1",
-                        ImmutableList.of("1.1"),
-                        ImmutableList.of());
-
-        Layout discardedFingerprintLayout =
-                Layout.newBuilder()
-                        .setRoot(layout.getRoot())
-                        .setFingerprint(
-                                TreeFingerprint.newBuilder().setRoot(discardedFingerPrintRoot))
-                        .build();
-
-        LayoutDiff diff =
-                ProtoLayoutDiffer.getDiff(layout.getFingerprint(), discardedFingerprintLayout);
-        assertThat(diff.getChangedNodes()).hasSize(1);
-        assertThat(diff.getChangedNodes().get(0).isSelfOnlyChange()).isTrue();
-    }
-
-    @Test
-    public void getChangedNodes_selfChangeAndChildren_isAllChange() {
-        Layout layout =
-                layout(
-                        column( // 1
-                                row( // 1.1
-                                        text("Foo"), // 1.1.1
-                                        text("Bar") // 1.1.2
-                                        )));
-        NodeFingerprint discardedFingerPrintRoot =
-                buildShadowDiscardedFingerprint(
-                        layout.getFingerprint().getRoot(),
-                        "1",
-                        ImmutableList.of("1.1"),
-                        ImmutableList.of("1.1"));
-
-        Layout discardedFingerprintLayout =
-                Layout.newBuilder()
-                        .setRoot(layout.getRoot())
-                        .setFingerprint(
-                                TreeFingerprint.newBuilder().setRoot(discardedFingerPrintRoot))
-                        .build();
-
-        LayoutDiff diff =
-                ProtoLayoutDiffer.getDiff(layout.getFingerprint(), discardedFingerprintLayout);
-        assertThat(diff.getChangedNodes()).hasSize(1);
-        assertThat(diff.getChangedNodes().get(0).isSelfOnlyChange()).isFalse();
-    }
-
-    @Test
     public void getChangedNodes_withOneUpdatedNode() {
         LayoutDiff diff =
                 ProtoLayoutDiffer.getDiff(
@@ -340,42 +246,6 @@
         assertThat(ProtoLayoutDiffer.isDescendantOf(childPosId, parentPosId)).isFalse();
     }
 
-    private NodeFingerprint buildShadowDiscardedFingerprint(
-            NodeFingerprint fingerprintRoot,
-            String rootPosId,
-            List<String> discardedNodes,
-            List<String> discardedChilds) {
-        NodeFingerprint.Builder shadowNodeBuilder = NodeFingerprint.newBuilder();
-        shadowNodeBuilder.setSelfTypeValue(fingerprintRoot.getSelfTypeValue());
-        if (discardedNodes.contains(rootPosId)) {
-            shadowNodeBuilder.setSelfPropsValue(DISCARDED_FINGERPRINT_VALUE);
-        } else {
-            shadowNodeBuilder.setSelfPropsValue(fingerprintRoot.getSelfPropsValue());
-        }
-        boolean discardChildren = discardedChilds.contains(rootPosId);
-        if (discardChildren) {
-            shadowNodeBuilder.setChildNodesValue(DISCARDED_FINGERPRINT_VALUE);
-        } else {
-            shadowNodeBuilder.setChildNodesValue(fingerprintRoot.getChildNodesValue());
-        }
-        int childIndex = 1;
-        for (NodeFingerprint childNode : fingerprintRoot.getChildNodesList()) {
-            NodeFingerprint childNodeFingerprint =
-                    buildShadowDiscardedFingerprint(
-                            childNode,
-                            rootPosId + "." + childIndex++,
-                            discardedNodes,
-                            discardedChilds);
-            if (!discardChildren) {
-                shadowNodeBuilder.addChildNodes(childNodeFingerprint);
-            }
-            if (childNodeFingerprint.getSelfPropsValue() == DISCARDED_FINGERPRINT_VALUE) {
-                shadowNodeBuilder.setChildNodesValue(DISCARDED_FINGERPRINT_VALUE);
-            }
-        }
-        return shadowNodeBuilder.build();
-    }
-
     private static Layout referenceLayout() {
         return layout(
                 column( // 1
diff --git a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/dynamicdata/ProtoLayoutDynamicDataPipelineTest.java b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/dynamicdata/ProtoLayoutDynamicDataPipelineTest.java
index 9bb0cbb..3c7e0b8 100644
--- a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/dynamicdata/ProtoLayoutDynamicDataPipelineTest.java
+++ b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/dynamicdata/ProtoLayoutDynamicDataPipelineTest.java
@@ -972,8 +972,8 @@
         makePipelineForDynamicBool(pipeline, expressionWith1Nodes, nodeInfo3);
 
         pipeline.initNewLayout();
-        // Now the pipeline will have a total expressionNodesCount of 6 = 5 + 1
-        // nodeInfo2 (failed to bound previously) and nodeInfo3(new) should be able to bound
+        // Now the pipeline will have a total expressionNodesCount of 6 = 5 + 1 nodeInfo2 (failed to
+        // bound previously) and nodeInfo3(new) should be able to bound
         expect.that(quotaManager.getRemainingQuota()).isEqualTo(2);
         expect.that(pipeline.mPositionIdTree.get(nodeInfo3).getFailedBindingRequest().size())
                 .isEqualTo(0);
diff --git a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/helper/TestDsl.java b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/helper/TestDsl.java
index a291354..520b0b4 100644
--- a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/helper/TestDsl.java
+++ b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/helper/TestDsl.java
@@ -124,7 +124,7 @@
 
         private LayoutElementProto.FontStyle toProto() {
             return LayoutElementProto.FontStyle.newBuilder()
-                    .setSize(sp(sizeSp))
+                    .addSize(sp(sizeSp))
                     .setItalic(bool(italic))
                     .setColor(color(colorArgb))
                     .build();
diff --git a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstanceTest.java b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstanceTest.java
index 2f8401c..1571b81 100644
--- a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstanceTest.java
+++ b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/impl/ProtoLayoutViewInstanceTest.java
@@ -224,7 +224,7 @@
     }
 
     @Test
-    public void adaptiveUpdateRatesEnabled_ongoingRendering_skipsNewLayout() throws Exception {
+    public void adaptiveUpdateRatesEnabled_ongoingRendering_skipsPreviousLayout() {
         FrameLayout container = new FrameLayout(mApplicationContext);
         setupInstance(/* adaptiveUpdateRatesEnabled= */ true);
         ListenableFuture<Void> result1 =
@@ -237,11 +237,11 @@
                         layout(column(text(TEXT1), text(TEXT3))), RESOURCES, container);
         shadowOf(Looper.getMainLooper()).idle();
 
-        assertNoException(result1);
-        assertThat(result2.isCancelled()).isTrue();
-        // Assert that only the modified text is reinflated.
-        assertThat(findViewsWithText(container, TEXT2)).hasSize(1);
-        assertThat(findViewsWithText(container, TEXT3)).isEmpty();
+        assertThat(result1.isCancelled()).isTrue();
+        assertThat(result2.isDone()).isTrue();
+        // Assert that the most recent layout is reinflated.
+        assertThat(findViewsWithText(container, TEXT2)).isEmpty();
+        assertThat(findViewsWithText(container, TEXT3)).hasSize(1);
     }
 
     @Test
@@ -390,6 +390,52 @@
         assertThat(mRootContainer.getChildCount()).isEqualTo(0);
     }
 
+    @Test
+    public void resourceVersionChange_sameLayout_causesFullInflation() throws Exception {
+        Layout layout1 = layout(text(TEXT1));
+        Resources resources1 = Resources.newBuilder().setVersion("1").build();
+        Layout layout2 = layout(text(TEXT1));
+        Resources resources2 = Resources.newBuilder().setVersion("2").build();
+        setupInstance(/* adaptiveUpdateRatesEnabled= */ true);
+        ListenableFuture<Void> result =
+                mInstanceUnderTest.renderAndAttach(layout1, resources1, mRootContainer);
+        shadowOf(Looper.getMainLooper()).idle();
+        assertNoException(result);
+        assertThat(findViewsWithText(mRootContainer, TEXT1)).hasSize(1);
+        View view1 = findViewsWithText(mRootContainer, TEXT1).get(0);
+
+        result = mInstanceUnderTest.renderAndAttach(layout2, resources2, mRootContainer);
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertNoException(result);
+        assertThat(findViewsWithText(mRootContainer, TEXT1)).hasSize(1);
+        View view2 = findViewsWithText(mRootContainer, TEXT1).get(0);
+        assertThat(view1).isNotSameInstanceAs(view2);
+    }
+
+    @Test
+    public void invalidateCache_sameResourceVersion_fullInflation() throws Exception {
+        Layout layout1 = layout(text(TEXT1));
+        Resources resources1 = Resources.newBuilder().setVersion("1").build();
+        Layout layout2 = layout(text(TEXT1));
+        Resources resources2 = Resources.newBuilder().setVersion("1").build();
+        setupInstance(/* adaptiveUpdateRatesEnabled= */ true);
+        ListenableFuture<Void> result =
+                mInstanceUnderTest.renderAndAttach(layout1, resources1, mRootContainer);
+        shadowOf(Looper.getMainLooper()).idle();
+        assertNoException(result);
+        assertThat(findViewsWithText(mRootContainer, TEXT1)).hasSize(1);
+        View view1 = findViewsWithText(mRootContainer, TEXT1).get(0);
+
+        mInstanceUnderTest.invalidateCache();
+        result = mInstanceUnderTest.renderAndAttach(layout2, resources2, mRootContainer);
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertNoException(result);
+        assertThat(findViewsWithText(mRootContainer, TEXT1)).hasSize(1);
+        View view2 = findViewsWithText(mRootContainer, TEXT1).get(0);
+        assertThat(view1).isNotSameInstanceAs(view2);
+    }
 
     @Test
     public void adaptiveUpdateRatesEnabled_rootElementdiff_keepsElementCentered() throws Exception {
diff --git a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflaterTest.java b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflaterTest.java
index fc19485..214c868e 100644
--- a/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflaterTest.java
+++ b/wear/protolayout/protolayout-renderer/src/test/java/androidx/wear/protolayout/renderer/inflater/ProtoLayoutInflaterTest.java
@@ -31,6 +31,7 @@
 import static androidx.wear.protolayout.renderer.helper.TestDsl.layout;
 import static androidx.wear.protolayout.renderer.helper.TestDsl.row;
 import static androidx.wear.protolayout.renderer.helper.TestDsl.text;
+import static androidx.wear.protolayout.renderer.inflater.ProtoLayoutInflater.TEXT_AUTOSIZES_LIMIT;
 import static androidx.wear.protolayout.renderer.inflater.ProtoLayoutInflater.getFrameLayoutGravity;
 import static androidx.wear.protolayout.renderer.inflater.ProtoLayoutInflater.getRenderedMetadata;
 import static androidx.wear.protolayout.renderer.test.R.drawable.android_animated_24dp;
@@ -38,6 +39,8 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.robolectric.Shadows.shadowOf;
 
 import static java.lang.Integer.MAX_VALUE;
@@ -112,6 +115,7 @@
 import androidx.wear.protolayout.proto.AlignmentProto.VerticalAlignment;
 import androidx.wear.protolayout.proto.AlignmentProto.VerticalAlignmentProp;
 import androidx.wear.protolayout.proto.ColorProto.ColorProp;
+import androidx.wear.protolayout.proto.DimensionProto;
 import androidx.wear.protolayout.proto.DimensionProto.ArcLineLength;
 import androidx.wear.protolayout.proto.DimensionProto.ArcSpacerLength;
 import androidx.wear.protolayout.proto.DimensionProto.ContainerDimension;
@@ -283,20 +287,19 @@
 
     @Test
     public void inflate_textView_withEmptyValueForLayout() {
-        LayoutElement root =
-            LayoutElement.newBuilder()
-                .setText(
-                    Text.newBuilder()
-                        .setText(
-                            StringProp.newBuilder()
-                                .setValue("abcde")
-                                .setDynamicValue(
-                                    DynamicString.newBuilder()
+        StringProp stringProp =
+                StringProp.newBuilder()
+                        .setValue("abcde")
+                        .setDynamicValue(
+                                DynamicString.newBuilder()
                                         .setFixed(
-                                            FixedString.newBuilder()
-                                                .setValue("Dynamic Fixed Text")))
-                                        .setValueForLayout("")))
-                .build();
+                                                FixedString.newBuilder()
+                                                        .setValue("Dynamic Fixed Text")))
+                        .setValueForLayout("")
+                        .build();
+
+        LayoutElement root =
+                LayoutElement.newBuilder().setText(Text.newBuilder().setText(stringProp)).build();
 
         FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
 
@@ -1124,6 +1127,31 @@
     }
 
     @Test
+    public void inflate_arc_withText_autoSize_notSet() {
+        int lastSize = 12;
+        FontStyle.Builder style = FontStyle.newBuilder()
+                .addAllSize(buildSizesList(new int[]{10, 20, lastSize}));
+        LayoutElement root =
+                LayoutElement.newBuilder()
+                        .setArc(
+                                Arc.newBuilder()
+                                        .setAnchorAngle(degrees(0).build())
+                                        .addContents(
+                                                ArcLayoutElement.newBuilder()
+                                                        .setText(
+                                                                ArcText.newBuilder()
+                                                                        .setText(string("text1"))
+                                                                        .setFontStyle(style))))
+                        .build();
+
+        FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
+        ArcLayout arcLayout = (ArcLayout) rootLayout.getChildAt(0);
+        CurvedTextView tv = (CurvedTextView) arcLayout.getChildAt(0);
+        assertThat(tv.getText()).isEqualTo("text1");
+        expect.that(tv.getTextSize()).isEqualTo(lastSize);
+    }
+
+    @Test
     public void inflate_arc_withSpacer() {
         LayoutElement root =
                 LayoutElement.newBuilder()
@@ -1934,6 +1962,137 @@
     }
 
     @Test
+    public void inflate_textView_autosize_set() {
+        String text = "Test text";
+        int[] presetSizes = new int[]{12, 20, 10};
+        List<DimensionProto.SpProp> sizes = buildSizesList(presetSizes);
+
+        LayoutElement textElement =
+                LayoutElement.newBuilder()
+                        .setText(
+                                Text.newBuilder()
+                                        .setText(string(text))
+                                        .setFontStyle(
+                                                FontStyle.newBuilder()
+                                                        .addAllSize(sizes)))
+                        .build();
+        LayoutElement root =
+                LayoutElement.newBuilder().setBox(
+                        Box.newBuilder()
+                                .setWidth(expand())
+                                .setHeight(expand())
+                                .addContents(textElement)).build();
+
+        FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
+        ViewGroup firstChild = (ViewGroup) rootLayout.getChildAt(0);
+        TextView tv = (TextView) firstChild.getChildAt(0);
+
+        // TextView sorts preset sizes.
+        Arrays.sort(presetSizes);
+        expect.that(tv.getAutoSizeTextType()).isEqualTo(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
+        expect.that(tv.getAutoSizeTextAvailableSizes()).isEqualTo(presetSizes);
+        expect.that(tv.getTextSize()).isEqualTo(20);
+    }
+
+    @Test
+    public void inflate_textView_autosize_setLimit_usesSingleSize() {
+        String text = "Test text";
+        int sizesLength = TEXT_AUTOSIZES_LIMIT + 5;
+        int[] presetSizes = new int[sizesLength];
+        int expectedLastSize = 120;
+        for (int i = 0; i < sizesLength - 1; i++) {
+            presetSizes[i] = i + 1;
+        }
+        presetSizes[sizesLength - 1] = expectedLastSize;
+        List<DimensionProto.SpProp> sizes = buildSizesList(presetSizes);
+
+        LayoutElement textElement =
+                LayoutElement.newBuilder()
+                        .setText(
+                                Text.newBuilder()
+                                        .setText(string(text))
+                                        .setMaxLines(Int32Prop.newBuilder().setValue(4))
+                                        .setFontStyle(
+                                                FontStyle.newBuilder()
+                                                        .addAllSize(sizes)))
+                        .build();
+        LayoutElement root =
+                LayoutElement.newBuilder().setBox(
+                        Box.newBuilder()
+                                .setWidth(expand())
+                                .setHeight(expand())
+                                .addContents(textElement)).build();
+
+        FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
+        ViewGroup firstChild = (ViewGroup) rootLayout.getChildAt(0);
+        TextView tv = (TextView) firstChild.getChildAt(0);
+        expect.that(tv.getAutoSizeTextType()).isEqualTo(TextView.AUTO_SIZE_TEXT_TYPE_NONE);
+        expect.that(tv.getAutoSizeTextAvailableSizes()).isEmpty();
+        expect.that(tv.getTextSize()).isEqualTo(expectedLastSize);
+    }
+
+    @Test
+    public void inflate_textView_autosize_notSet() {
+        String text = "Test text";
+        int size = 24;
+        List<DimensionProto.SpProp> sizes = buildSizesList(new int[]{size});
+
+        LayoutElement textElement =
+                LayoutElement.newBuilder()
+                        .setText(
+                                Text.newBuilder()
+                                        .setText(string(text))
+                                        .setFontStyle(
+                                                FontStyle.newBuilder()
+                                                        .addAllSize(sizes)))
+                        .build();
+        LayoutElement root =
+                LayoutElement.newBuilder().setBox(
+                        Box.newBuilder()
+                                .setWidth(expand())
+                                .setHeight(expand())
+                                .addContents(textElement)).build();
+
+        FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
+        ViewGroup firstChild = (ViewGroup) rootLayout.getChildAt(0);
+        TextView tv = (TextView) firstChild.getChildAt(0);
+        expect.that(tv.getAutoSizeTextType()).isEqualTo(TextView.AUTO_SIZE_TEXT_TYPE_NONE);
+        expect.that(tv.getAutoSizeTextAvailableSizes()).isEmpty();
+        expect.that(tv.getTextSize()).isEqualTo(size);
+    }
+
+    @Test
+    public void inflate_textView_autosize_setDynamic_noop() {
+        String text = "Test text";
+        int lastSize = 24;
+        List<DimensionProto.SpProp> sizes = buildSizesList(new int[]{10, 30, lastSize});
+
+        LayoutElement textElement =
+                LayoutElement.newBuilder()
+                        .setText(
+                                Text.newBuilder()
+                                        .setText(dynamicString(text))
+                                        .setFontStyle(
+                                                FontStyle.newBuilder()
+                                                        .addAllSize(sizes)))
+                        .build();
+        LayoutElement root =
+                LayoutElement.newBuilder().setBox(
+                        Box.newBuilder()
+                                .setWidth(expand())
+                                .setHeight(expand())
+                                .addContents(textElement)).build();
+
+        FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
+        ArrayList<View> textChildren = new ArrayList<>();
+        rootLayout.findViewsWithText(textChildren, text, View.FIND_VIEWS_WITH_TEXT);
+        TextView tv = (TextView) textChildren.get(0);
+        expect.that(tv.getAutoSizeTextType()).isEqualTo(TextView.AUTO_SIZE_TEXT_TYPE_NONE);
+        expect.that(tv.getAutoSizeTextAvailableSizes()).isEmpty();
+        expect.that(tv.getTextSize()).isEqualTo(lastSize);
+    }
+
+    @Test
     public void inflate_spannable_marqueeAnimation() {
         String text = "Marquee Animation";
         LayoutElement root =
@@ -1964,6 +2123,29 @@
     }
 
     @Test
+    public void inflate_spantext_ignoresMultipleSizes() {
+        String text = "Test text";
+        int firstSize = 12;
+        FontStyle.Builder style = FontStyle.newBuilder()
+                .addAllSize(buildSizesList(new int[]{firstSize, 10, 20}));
+        LayoutElement root =
+                LayoutElement.newBuilder()
+                        .setSpannable(
+                                Spannable.newBuilder()
+                                        .addSpans(
+                                                Span.newBuilder()
+                                                        .setText(
+                                                                SpanText.newBuilder()
+                                                                        .setText(string(text))
+                                                                        .setFontStyle(style))))
+                        .build();
+
+        FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
+        TextView tv = (TextView) rootLayout.getChildAt(0);
+        expect.that(tv.getAutoSizeTextType()).isEqualTo(TextView.AUTO_SIZE_TEXT_TYPE_NONE);
+    }
+
+    @Test
     public void inflate_spannable_marqueeAnimation_repeatLimit() {
         String text = "Marquee Animation";
         int marqueeIterations = 5;
@@ -2145,23 +2327,23 @@
         DynamicFloat arcLength =
                 DynamicFloat.newBuilder().setFixed(FixedFloat.newBuilder().setValue(45f)).build();
 
+        ArcLayoutElement arcLine =
+                ArcLayoutElement.newBuilder()
+                        .setLine(
+                                ArcLine.newBuilder()
+                                        // Shorter than 360 degrees, so should be drawn as an arc:
+                                        .setLength(
+                                                degreesDynamic(
+                                                        arcLength, /* valueForLayout= */ 180f))
+                                        .setThickness(dp(12)))
+                        .build();
+
         LayoutElement root =
                 LayoutElement.newBuilder()
                         .setArc(
                                 Arc.newBuilder()
                                         .setAnchorAngle(degrees(0).build())
-                                        .addContents(
-                                                ArcLayoutElement.newBuilder()
-                                                        .setLine(
-                                                                ArcLine.newBuilder()
-                                                                        // Shorter than 360 degrees,
-                                                                        // so should be drawn as an
-                                                                        // arc:
-                                                                        .setLength(
-                                                                                degreesDynamic(
-                                                                                        arcLength,
-                                                                                        180f))
-                                                                        .setThickness(dp(12)))))
+                                        .addContents(arcLine))
                         .build();
 
         FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
@@ -2181,20 +2363,21 @@
         DynamicFloat arcLength =
                 DynamicFloat.newBuilder().setFixed(FixedFloat.newBuilder().setValue(45f)).build();
 
+        ArcLayoutElement arcLine =
+                ArcLayoutElement.newBuilder()
+                        .setLine(
+                                ArcLine.newBuilder()
+                                        .setLength(
+                                                degreesDynamic(arcLength, /* valueForLayout= */ 0f))
+                                        .setThickness(dp(12)))
+                        .build();
+
         LayoutElement root =
                 LayoutElement.newBuilder()
                         .setArc(
                                 Arc.newBuilder()
                                         .setAnchorAngle(degrees(0).build())
-                                        .addContents(
-                                                ArcLayoutElement.newBuilder()
-                                                        .setLine(
-                                                                ArcLine.newBuilder()
-                                                                        .setLength(
-                                                                                degreesDynamic(
-                                                                                        arcLength,
-                                                                                        0f))
-                                                                        .setThickness(dp(12)))))
+                                        .addContents(arcLine))
                         .build();
 
         FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
@@ -2231,23 +2414,22 @@
                                                                         .setSourceKey("foo"))))
                         .build();
 
+        ArcLayoutElement arcLine =
+                ArcLayoutElement.newBuilder()
+                        .setLine(
+                                ArcLine.newBuilder()
+                                        // Shorter than 360 degrees, so should be drawn as an arc:
+                                        .setLength(
+                                                degreesDynamic(
+                                                        arcLength, /* valueForLayout= */ 180f))
+                                        .setThickness(dp(12)))
+                        .build();
         LayoutElement root =
                 LayoutElement.newBuilder()
                         .setArc(
                                 Arc.newBuilder()
                                         .setAnchorAngle(degrees(0).build())
-                                        .addContents(
-                                                ArcLayoutElement.newBuilder()
-                                                        .setLine(
-                                                                ArcLine.newBuilder()
-                                                                        // Shorter than 360 degrees,
-                                                                        // so should be drawn as an
-                                                                        // arc:
-                                                                        .setLength(
-                                                                                degreesDynamic(
-                                                                                        arcLength,
-                                                                                        180f))
-                                                                        .setThickness(dp(12)))))
+                                        .addContents(arcLine))
                         .build();
 
         FrameLayout rootLayout = renderer(fingerprintedLayout(root)).inflate();
@@ -2637,8 +2819,7 @@
         assertThat(tv1AfterMutation.getText().toString()).isEqualTo("Hello");
         assertThat(tv2AfterMutation.getText().toString()).isEqualTo("Mars");
         // Can't get android resource ID from image, so use the size to infer that the image has
-        // been
-        // correctly updated to a different one:
+        // been correctly updated to a different one:
         assertThat(imageAfterMutation.getDrawable().getIntrinsicHeight()).isEqualTo(120);
         assertThat(imageAfterMutation.getDrawable().getIntrinsicWidth()).isEqualTo(120);
         assertThat(imageAfterMutation.getMeasuredHeight()).isEqualTo(50);
@@ -3980,6 +4161,35 @@
     }
 
     @Test
+    public void exitTransition_noQuota_notPlayed_withDynamicNode() {
+        Renderer renderer =
+                renderer(
+                        newRendererConfigBuilder(
+                                fingerprintedLayout(
+                                        getDynamicTextElementWithExitAnimation(
+                                                "Hello", /* iterations= */ 1))),
+                        new FixedQuotaManagerImpl(/* quotaCap= */ 0));
+        mDataPipeline.setFullyVisible(true);
+        FrameLayout inflatedViewParent = renderer.inflate();
+        shadowOf(getMainLooper()).idle();
+
+        ViewGroupMutation mutation =
+                renderer.computeMutation(
+                        getRenderedMetadata(inflatedViewParent),
+                        fingerprintedLayout(textFadeIn("World")));
+
+        Runnable onEndTest = mock(Runnable.class);
+
+        mutation.mPipelineMaker
+                .get()
+                .playExitAnimations(inflatedViewParent, /* isReattaching= */ false, onEndTest);
+
+        shadowOf(Looper.getMainLooper()).idle();
+
+        verify(onEndTest).run();
+    }
+
+    @Test
     public void exitTransition_noQuota_notPlayed() throws Exception {
         Renderer renderer =
                 renderer(
@@ -4221,8 +4431,7 @@
                         getRenderedMetadata(inflatedViewParent),
                         fingerprintedLayout(
                                 getTextElementWithExitAnimation(
-                                        "Second mutation",
-                                        /* iterations= */ 10)));
+                                        "Second mutation", /* iterations= */ 10)));
 
         ListenableFuture<Void> applySecondMutationFuture =
                 renderer.mRenderer.applyMutation(inflatedViewParent, secondMutation);
@@ -4377,6 +4586,16 @@
                 .build();
     }
 
+    private LayoutElement getDynamicTextElementWithExitAnimation(String text, int iterations) {
+        return LayoutElement.newBuilder()
+                .setText(
+                        dynamicTextAnimVisibility(
+                                AnimatedVisibility.newBuilder()
+                                        .setExitTransition(getFadeOutExitAnimation(iterations)),
+                                text))
+                .build();
+    }
+
     private LayoutElement getMultipleTextElementWithExitAnimation(
             List<String> texts, int iterations) {
         Column.Builder column = Column.newBuilder();
@@ -4430,6 +4649,22 @@
                 .setText(string(text).build());
     }
 
+    @NonNull
+    private Text.Builder dynamicTextAnimVisibility(AnimatedVisibility.Builder snapTo, String text) {
+        return Text.newBuilder()
+                .setModifiers(Modifiers.newBuilder().setContentUpdateAnimation(snapTo.build()))
+                .setText(
+                        StringProp.newBuilder()
+                                .setDynamicValue(
+                                        DynamicString.newBuilder()
+                                                .setFixed(
+                                                        FixedString.newBuilder()
+                                                                .setValue(text)
+                                                                .build())
+                                                .build())
+                                .build());
+    }
+
     private EnterTransition.Builder slideIn(int snapTo) {
         return EnterTransition.newBuilder()
                 .setSlideIn(
@@ -4452,6 +4687,11 @@
     }
 
     @NonNull
+    private static DimensionProto.SpProp sp(float value) {
+        return DimensionProto.SpProp.newBuilder().setValue(value).build();
+    }
+
+    @NonNull
     private static ContainerDimension.Builder expand() {
         return ContainerDimension.newBuilder()
                 .setExpandedDimension(ExpandedDimensionProp.getDefaultInstance());
@@ -4480,8 +4720,26 @@
     }
 
     @NonNull
+    private static StringProp.Builder dynamicString(String value) {
+        return StringProp.newBuilder()
+                .setValue(value)
+                .setDynamicValue(
+                        DynamicString.newBuilder()
+                                .setFixed(FixedString.newBuilder().setValue(value)));
+    }
+
+    @NonNull
     private static ImageDimension.Builder expandImage() {
         return ImageDimension.newBuilder()
                 .setExpandedDimension(ExpandedDimensionProp.getDefaultInstance());
     }
+
+    @NonNull
+    private static List<DimensionProto.SpProp> buildSizesList(int[] presetSizes) {
+        List<DimensionProto.SpProp> sizes = new ArrayList<>(3);
+        for (int s: presetSizes) {
+            sizes.add(sp(s));
+        }
+        return sizes;
+    }
 }
diff --git a/wear/protolayout/protolayout/api/current.txt b/wear/protolayout/protolayout/api/current.txt
index 6b9b160..72af032 100644
--- a/wear/protolayout/protolayout/api/current.txt
+++ b/wear/protolayout/protolayout/api/current.txt
@@ -129,14 +129,16 @@
   }
 
   public static final class ColorBuilders.SweepGradient implements androidx.wear.protolayout.ColorBuilders.Brush {
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getAngularShift();
     method public java.util.List<androidx.wear.protolayout.ColorBuilders.ColorStop!> getColorStops();
+    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getEndAngle();
+    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getStartAngle();
   }
 
   public static final class ColorBuilders.SweepGradient.Builder {
     ctor @java.lang.SafeVarargs public ColorBuilders.SweepGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorStop!...);
     method public androidx.wear.protolayout.ColorBuilders.SweepGradient build();
-    method public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setAngularShift(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
+    method public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setEndAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
+    method public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setStartAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
   }
 
   public final class DeviceParametersBuilders {
@@ -551,6 +553,7 @@
     method public androidx.wear.protolayout.TypeBuilders.BoolProp? getItalic();
     method public androidx.wear.protolayout.DimensionBuilders.EmProp? getLetterSpacing();
     method public androidx.wear.protolayout.DimensionBuilders.SpProp? getSize();
+    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public java.util.List<androidx.wear.protolayout.DimensionBuilders.SpProp!> getSizes();
     method public androidx.wear.protolayout.TypeBuilders.BoolProp? getUnderline();
     method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp? getVariant();
     method public androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp? getWeight();
@@ -564,6 +567,7 @@
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setItalic(boolean);
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setLetterSpacing(androidx.wear.protolayout.DimensionBuilders.EmProp);
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSize(androidx.wear.protolayout.DimensionBuilders.SpProp);
+    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSizes(androidx.wear.protolayout.DimensionBuilders.SpProp!...);
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setUnderline(androidx.wear.protolayout.TypeBuilders.BoolProp);
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setUnderline(boolean);
     method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setVariant(androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp);
diff --git a/wear/protolayout/protolayout/api/restricted_current.txt b/wear/protolayout/protolayout/api/restricted_current.txt
index 6b9b160..72af032 100644
--- a/wear/protolayout/protolayout/api/restricted_current.txt
+++ b/wear/protolayout/protolayout/api/restricted_current.txt
@@ -129,14 +129,16 @@
   }
 
   public static final class ColorBuilders.SweepGradient implements androidx.wear.protolayout.ColorBuilders.Brush {
-    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp? getAngularShift();
     method public java.util.List<androidx.wear.protolayout.ColorBuilders.ColorStop!> getColorStops();
+    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getEndAngle();
+    method public androidx.wear.protolayout.DimensionBuilders.DegreesProp getStartAngle();
   }
 
   public static final class ColorBuilders.SweepGradient.Builder {
     ctor @java.lang.SafeVarargs public ColorBuilders.SweepGradient.Builder(androidx.wear.protolayout.ColorBuilders.ColorStop!...);
     method public androidx.wear.protolayout.ColorBuilders.SweepGradient build();
-    method public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setAngularShift(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
+    method public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setEndAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
+    method public androidx.wear.protolayout.ColorBuilders.SweepGradient.Builder setStartAngle(androidx.wear.protolayout.DimensionBuilders.DegreesProp);
   }
 
   public final class DeviceParametersBuilders {
@@ -551,6 +553,7 @@
     method public androidx.wear.protolayout.TypeBuilders.BoolProp? getItalic();
     method public androidx.wear.protolayout.DimensionBuilders.EmProp? getLetterSpacing();
     method public androidx.wear.protolayout.DimensionBuilders.SpProp? getSize();
+    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public java.util.List<androidx.wear.protolayout.DimensionBuilders.SpProp!> getSizes();
     method public androidx.wear.protolayout.TypeBuilders.BoolProp? getUnderline();
     method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp? getVariant();
     method public androidx.wear.protolayout.LayoutElementBuilders.FontWeightProp? getWeight();
@@ -564,6 +567,7 @@
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setItalic(boolean);
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setLetterSpacing(androidx.wear.protolayout.DimensionBuilders.EmProp);
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSize(androidx.wear.protolayout.DimensionBuilders.SpProp);
+    method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setSizes(androidx.wear.protolayout.DimensionBuilders.SpProp!...);
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setUnderline(androidx.wear.protolayout.TypeBuilders.BoolProp);
     method public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setUnderline(boolean);
     method @SuppressCompatibility @androidx.wear.protolayout.expression.ProtoLayoutExperimental public androidx.wear.protolayout.LayoutElementBuilders.FontStyle.Builder setVariant(androidx.wear.protolayout.LayoutElementBuilders.FontVariantProp);
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ColorBuilders.java b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ColorBuilders.java
index d183294..6a61f55 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ColorBuilders.java
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/ColorBuilders.java
@@ -378,7 +378,7 @@
          *
          * <p>A color stop is a pair of a color and its offset in the gradient. The offset is the
          * relative position of the color, beginning with 0 from the start angle and ending with 1.0
-         * after spanning 360 degrees clockwise.
+         * at the end angle, spanning clockwise.
          *
          * <p>There must be at least 2 colors.
          *
@@ -398,20 +398,42 @@
         }
 
         /**
-         * Gets the angular shift relative to the element's parent base angle. This is used to shift
-         * the start angle of the gradient.
+         * Gets the start angle of the gradient relative to the element's base angle. If not set,
+         * defaults to zero.
          *
          * <p>For {@link androidx.wear.protolayout.LayoutElementBuilders.ArcLine}, the base angle is
-         * the angle where the line starts.
+         * the angle where the line starts. The value represents a relative position in the line's
+         * length span. Values greater than 360 degrees correspond to upper layers of the arc line
+         * as it wraps over itself.
          *
          * @since 1.3
          */
-        @Nullable
-        public DegreesProp getAngularShift() {
-            if (mImpl.hasAngularShift()) {
-                return DegreesProp.fromProto(mImpl.getAngularShift());
+        @NonNull
+        public DegreesProp getStartAngle() {
+            if (mImpl.hasStartAngle()) {
+                return DegreesProp.fromProto(mImpl.getStartAngle());
             } else {
-                return null;
+                return new DegreesProp.Builder(0f).build();
+            }
+        }
+
+        /**
+         * Gets the end angle of the gradient, relative to the element's base angle. If not set,
+         * defaults to 360 degrees.
+         *
+         * <p>For {@link androidx.wear.protolayout.LayoutElementBuilders.ArcLine}, the base angle is
+         * the angle where the line starts. The value represents a relative position in the line's
+         * length span. Values greater than 360 degrees correspond to upper layers of the arc line
+         * as it wraps over itself.
+         *
+         * @since 1.3
+         */
+        @NonNull
+        public DegreesProp getEndAngle() {
+            if (mImpl.hasEndAngle()) {
+                return DegreesProp.fromProto(mImpl.getEndAngle());
+            } else {
+                return new DegreesProp.Builder(360f).build();
             }
         }
 
@@ -454,8 +476,10 @@
             return "SweepGradient{"
                     + "colorStops="
                     + getColorStops()
-                    + ", angularShift="
-                    + getAngularShift()
+                    + ", startAngle="
+                    + getStartAngle()
+                    + ", endAngle="
+                    + getEndAngle()
                     + "}";
         }
 
@@ -472,7 +496,7 @@
              *
              * <p>A color stop is a pair of a color and its offset in the gradient. The offset is
              * the relative position of the color, beginning with 0 from the start angle and ending
-             * with 1.0 after spanning 360 degrees clockwise.
+             * with 1.0 at the end angle, spanning clockwise.
              *
              * <p>There must be at least 2 colors.
              *
@@ -492,25 +516,52 @@
             }
 
             /**
-             * Sets the angular shift relative to the element's parent base angle. This is used to
-             * shift the start angle of the gradient.
+             * Sets the start angle of the gradient relative to the element's base angle. If not
+             * set, defaults to zero.
              *
              * <p>For {@link androidx.wear.protolayout.LayoutElementBuilders.ArcLine}, the base
-             * angle is the angle where the line starts.
+             * angle is the angle where the line starts. The value represents a relative position in
+             * the line's length span. Values greater than 360 degrees correspond to upper layers of
+             * the arc line as it wraps over itself.
              *
              * <p>Note that this field only supports static values.
              *
              * @since 1.3
              */
             @NonNull
-            public Builder setAngularShift(@NonNull DegreesProp angularShift) {
-                if (angularShift.getDynamicValue() != null) {
+            public Builder setStartAngle(@NonNull DegreesProp startAngle) {
+                if (startAngle.getDynamicValue() != null) {
                     throw new IllegalArgumentException(
-                            "setAngularShift doesn't support dynamic values.");
+                            "setStartAngle doesn't support dynamic values.");
                 }
-                mImpl.setAngularShift(angularShift.toProto());
+                mImpl.setStartAngle(startAngle.toProto());
                 mFingerprint.recordPropertyUpdate(
-                        2, checkNotNull(angularShift.getFingerprint()).aggregateValueAsInt());
+                        2, checkNotNull(startAngle.getFingerprint()).aggregateValueAsInt());
+                return this;
+            }
+
+            /**
+             * Sets the end angle of the gradient, relative to the element's base angle. If not set,
+             * defaults to 360 degrees.
+             *
+             * <p>For {@link androidx.wear.protolayout.LayoutElementBuilders.ArcLine}, the base
+             * angle is the angle where the line starts. The value represents a relative position in
+             * the line's length span. Values greater than 360 degrees correspond to upper layers of
+             * the arc line as it wraps over itself.
+             *
+             * <p>Note that this field only supports static values.
+             *
+             * @since 1.3
+             */
+            @NonNull
+            public Builder setEndAngle(@NonNull DegreesProp endAngle) {
+                if (endAngle.getDynamicValue() != null) {
+                    throw new IllegalArgumentException(
+                            "setEndAngle doesn't support dynamic values.");
+                }
+                mImpl.setEndAngle(endAngle.toProto());
+                mFingerprint.recordPropertyUpdate(
+                        3, checkNotNull(endAngle.getFingerprint()).aggregateValueAsInt());
                 return this;
             }
 
@@ -522,7 +573,7 @@
              *     degrees clockwise, finishing at the same angle.
              *     <p>A color stop is composed of a color and its offset in the gradient. The offset
              *     is the relative position of the color, beginning with 0 from the start angle and
-             *     ending with 1.0 after spanning 360 degrees clockwise.
+             *     ending with 1.0 at the end angle, spanning clockwise.
              *     <p>If offsets are not set, the colors are evenly distributed in the gradient.
              *     <p>If the offset values are not monotonic, the drawing may produce unexpected
              *     results.
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/LayoutElementBuilders.java b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/LayoutElementBuilders.java
index 80c73df..1cf6bce 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/LayoutElementBuilders.java
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/LayoutElementBuilders.java
@@ -27,6 +27,7 @@
 import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
+import androidx.annotation.VisibleForTesting;
 import androidx.wear.protolayout.ColorBuilders.Brush;
 import androidx.wear.protolayout.ColorBuilders.ColorProp;
 import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters;
@@ -608,21 +609,6 @@
         }
 
         /**
-         * Gets the size of the font, in scaled pixels (sp). If not specified, defaults to the size
-         * of the system's "body" font.
-         *
-         * @since 1.0
-         */
-        @Nullable
-        public SpProp getSize() {
-            if (mImpl.hasSize()) {
-                return SpProp.fromProto(mImpl.getSize());
-            } else {
-                return null;
-            }
-        }
-
-        /**
          * Gets whether the text should be rendered in a italic typeface. If not specified, defaults
          * to "false".
          *
@@ -713,6 +699,35 @@
             }
         }
 
+        /**
+         * Gets the size of the font, in scaled pixels (sp). If not specified, defaults to the size
+         * of the system's "body" font. If more than one size was originally added, it will
+         * return the last one.
+         *
+         * @since 1.0
+         */
+        @Nullable
+        public SpProp getSize() {
+            List<DimensionProto.SpProp> sizes = mImpl.getSizeList();
+            return !sizes.isEmpty() ? SpProp.fromProto(sizes.get(sizes.size() - 1)) : null;
+        }
+
+        /**
+         * Gets the available sizes of the font, in scaled pixels (sp). If not specified, defaults
+         * to the size of the system's "body" font.
+         *
+         * @since 1.3
+         */
+        @NonNull
+        @ProtoLayoutExperimental
+        public List<SpProp> getSizes() {
+            List<SpProp> list = new ArrayList<>();
+            for (DimensionProto.SpProp item : mImpl.getSizeList()) {
+                list.add(SpProp.fromProto(item));
+            }
+            return Collections.unmodifiableList(list);
+        }
+
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @Nullable
@@ -764,6 +779,7 @@
 
         /** Builder for {@link FontStyle} */
         public static final class Builder {
+            @VisibleForTesting static final int TEXT_SIZES_LIMIT = 10;
             private final LayoutElementProto.FontStyle.Builder mImpl =
                     LayoutElementProto.FontStyle.newBuilder();
             private final Fingerprint mFingerprint = new Fingerprint(-374492482);
@@ -771,16 +787,48 @@
             public Builder() {}
 
             /**
-             * Sets the size of the font, in scaled pixels (sp). If not specified, defaults to the
-             * size of the system's "body" font.
+             * Sets the available sizes of the font, in scaled  pixels (sp). If not specified,
+             * defaults to the size of the system's "body" font.
              *
-             * @since 1.0
+             * <p>If more than one size is specified and this {@link FontStyle} is applied to a
+             * {@link Text} element with static text, the text size will be automatically picked
+             * from the provided sizes to try to perfectly fit within its parent bounds. In other
+             * words, the largest size from the specified preset sizes that can fit the most text
+             * within the parent bounds will be used.
+             *
+             * <p>The specified sizes don't have to be sorted. The maximum number of sizes used is
+             * limited to 10.
+             *
+             * <p>Note that, if multiple sizes are set, the parent of the {@link Text} element this
+             * corresponds to shouldn't have its width and height set to wrapped, as it can lead to
+             * unexpected results.
+             *
+             * <p>If this {@link FontStyle} is set to any other element besides {@link Text} or
+             * that {@link Text} element has dynamic field, only the last added size will be use.
+             *
+             * <p>Any previously added values with this method or {@link #setSize} will be cleared.
+             *
+             * <p>While this field is accessible from 1.0 as singular, it only accepts multiple
+             * values since version 1.3 and renderers supporting version 1.3 will use the multiple
+             * values to automatically scale text. Renderers who don't support this version will
+             * use the last size among multiple values.
+             *
+             * @throws IllegalArgumentException if the number of available sizes is larger than 10.
+             * @since 1.3
              */
             @NonNull
-            public Builder setSize(@NonNull SpProp size) {
-                mImpl.setSize(size.toProto());
-                mFingerprint.recordPropertyUpdate(
-                        1, checkNotNull(size.getFingerprint()).aggregateValueAsInt());
+            @ProtoLayoutExperimental
+            public Builder setSizes(@NonNull SpProp... sizes) {
+                if (sizes.length > TEXT_SIZES_LIMIT) {
+                    throw new IllegalArgumentException(
+                            "Number of available sizes can't be larger than 10.");
+                }
+                mImpl.clearSize();
+                for (SpProp size: sizes) {
+                    mImpl.addSize(size.toProto());
+                    mFingerprint.recordPropertyUpdate(
+                            1, checkNotNull(size.getFingerprint()).aggregateValueAsInt());
+                }
                 return this;
             }
 
@@ -830,6 +878,23 @@
             }
 
             /**
+             * Sets the size of the font, in scaled pixels (sp). If not specified, defaults to the
+             * size of the system's "body" font.
+             *
+             * <p>Any previously added values with this method or {@link #setSizes} will be cleared.
+             *
+             * @since 1.0
+             */
+            @NonNull
+            public Builder setSize(@NonNull SpProp size) {
+                mImpl.clearSize();
+                mImpl.addSize(size.toProto());
+                mFingerprint.recordPropertyUpdate(
+                        1, checkNotNull(size.getFingerprint()).aggregateValueAsInt());
+                return this;
+            }
+
+            /**
              * Sets the text color. If not defined, defaults to white.
              *
              * <p>While this field is statically accessible from 1.0, it's only bindable since
diff --git a/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/LayoutElementBuildersTest.java b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/LayoutElementBuildersTest.java
index a30c860..6f10e5a 100644
--- a/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/LayoutElementBuildersTest.java
+++ b/wear/protolayout/protolayout/src/test/java/androidx/wear/protolayout/LayoutElementBuildersTest.java
@@ -16,6 +16,8 @@
 
 package androidx.wear.protolayout;
 
+import static androidx.wear.protolayout.DimensionBuilders.sp;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertThrows;
@@ -203,6 +205,84 @@
     }
 
     @Test
+    public void testFontStyleSetMultipleSizes() {
+        int size1 = 12;
+        int size2 = 30;
+        int lastSize = 20;
+        int[] expectedSizes = {size1, size2, lastSize};
+        LayoutElementBuilders.FontStyle fontStyle =
+                new LayoutElementBuilders.FontStyle.Builder()
+                        .setSizes(sp(size1), sp(size2), sp(lastSize))
+                        .build();
+
+        LayoutElementProto.FontStyle fontStyleProto = fontStyle.toProto();
+
+        assertThat(
+                fontStyleProto.getSizeList().stream().mapToInt(sp -> (int) sp.getValue()).toArray())
+                .isEqualTo(expectedSizes);
+        // Make sure that if 1 size is used than it's the last one.
+        assertThat(fontStyle.getSize().getValue()).isEqualTo(lastSize);
+        assertThat(
+                fontStyle.getSizes().stream().mapToInt(sp -> (int) sp.getValue()).toArray())
+                .isEqualTo(expectedSizes);
+    }
+
+    @Test
+    public void testFontStyleSetSize_moreTimes_usesLastOne() {
+        int lastSize = 20;
+        LayoutElementBuilders.FontStyle fontStyle =
+                new LayoutElementBuilders.FontStyle.Builder()
+                        .setSize(sp(12))
+                        .setSize(sp(30))
+                        .setSize(sp(lastSize))
+                        .build();
+
+        LayoutElementProto.FontStyle fontStyleProto = fontStyle.toProto();
+
+        assertThat(fontStyleProto.getSizeList().size()).isEqualTo(1);
+        assertThat(fontStyleProto.getSizeList().get(0).getValue()).isEqualTo(lastSize);
+        // Make sure that if 1 size is used than it's the last one.
+        assertThat(fontStyle.getSize().getValue()).isEqualTo(lastSize);
+        assertThat(fontStyle.getSizes().size()).isEqualTo(1);
+        assertThat(fontStyle.getSizes().get(0).getValue()).isEqualTo(lastSize);
+    }
+
+    @Test
+    public void testFontStyleSetSize_setSizes_overrides() {
+        int size1 = 12;
+        int size2 = 30;
+        int[] expectedSizes = {size1, size2};
+        LayoutElementBuilders.FontStyle fontStyle =
+                new LayoutElementBuilders.FontStyle.Builder()
+                        .setSize(sp(20))
+                        .setSizes(sp(size1), sp(size2))
+                        .build();
+
+        LayoutElementProto.FontStyle fontStyleProto = fontStyle.toProto();
+
+        assertThat(
+                fontStyleProto.getSizeList().stream().mapToInt(sp -> (int) sp.getValue()).toArray())
+                .isEqualTo(expectedSizes);
+        // Make sure that if 1 size is used than it's the last one.
+        assertThat(fontStyle.getSize().getValue()).isEqualTo(size2);
+        assertThat(
+                fontStyle.getSizes().stream().mapToInt(sp -> (int) sp.getValue()).toArray())
+                .isEqualTo(expectedSizes);
+    }
+
+    @Test
+    public void testFontStyleSetSize_tooManySizes_throws() {
+        DimensionBuilders.SpProp[] sizes =
+                new DimensionBuilders.SpProp[
+                        LayoutElementBuilders.FontStyle.Builder.TEXT_SIZES_LIMIT + 1];
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new LayoutElementBuilders.FontStyle.Builder()
+                        .setSizes(sizes)
+                        .build());
+    }
+
+    @Test
     public void textSetText_withoutLayoutConstraint_throws() {
         assertThrows(
                 IllegalStateException.class,
diff --git a/wear/tiles/tiles-renderer/api/api_lint.ignore b/wear/tiles/tiles-renderer/api/api_lint.ignore
index 93c6574..d7c58fd 100644
--- a/wear/tiles/tiles-renderer/api/api_lint.ignore
+++ b/wear/tiles/tiles-renderer/api/api_lint.ignore
@@ -1,8 +1,6 @@
 // Baseline format: 1.0
 AsyncSuffixFuture: androidx.wear.tiles.client.TileClient#requestApiVersion():
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
-AsyncSuffixFuture: androidx.wear.tiles.client.TileClient#requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest):
-    Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.tiles.client.TileClient#requestTile(androidx.wear.tiles.RequestBuilders.TileRequest):
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.tiles.client.TileClient#sendOnTileAddedEvent():
@@ -15,8 +13,6 @@
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.tiles.connection.DefaultTileClient#requestApiVersion():
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
-AsyncSuffixFuture: androidx.wear.tiles.connection.DefaultTileClient#requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest):
-    Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.tiles.connection.DefaultTileClient#requestTile(androidx.wear.tiles.RequestBuilders.TileRequest):
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.tiles.connection.DefaultTileClient#sendOnTileAddedEvent():
diff --git a/wear/tiles/tiles-testing/api/api_lint.ignore b/wear/tiles/tiles-testing/api/api_lint.ignore
index 0af6fa5..77dd871 100644
--- a/wear/tiles/tiles-testing/api/api_lint.ignore
+++ b/wear/tiles/tiles-testing/api/api_lint.ignore
@@ -1,8 +1,6 @@
 // Baseline format: 1.0
 AsyncSuffixFuture: androidx.wear.tiles.testing.TestTileClient#requestApiVersion():
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
-AsyncSuffixFuture: androidx.wear.tiles.testing.TestTileClient#requestResources(androidx.wear.tiles.RequestBuilders.ResourcesRequest):
-    Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.tiles.testing.TestTileClient#requestTile(androidx.wear.tiles.RequestBuilders.TileRequest):
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.tiles.testing.TestTileClient#sendOnTileAddedEvent():
diff --git a/wear/tiles/tiles/api/api_lint.ignore b/wear/tiles/tiles/api/api_lint.ignore
index 0ddbac4..02fb040 100644
--- a/wear/tiles/tiles/api/api_lint.ignore
+++ b/wear/tiles/tiles/api/api_lint.ignore
@@ -1,6 +1,4 @@
 // Baseline format: 1.0
-AsyncSuffixFuture: androidx.wear.tiles.TileService#onResourcesRequest(androidx.wear.tiles.RequestBuilders.ResourcesRequest):
-    Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.tiles.TileService#onTileRequest(androidx.wear.tiles.RequestBuilders.TileRequest):
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 
diff --git a/wear/tiles/tiles/lint-baseline.xml b/wear/tiles/tiles/lint-baseline.xml
index eb4c7b5..faa4a6b 100644
--- a/wear/tiles/tiles/lint-baseline.xml
+++ b/wear/tiles/tiles/lint-baseline.xml
@@ -1803,18 +1803,9 @@
 
     <issue
         id="RestrictedApiAndroidX"
-        message="FontStyle.hasSize can only be called from within the same library group (referenced groupId=`androidx.wear.protolayout` from groupId=`androidx.wear.tiles`)"
-        errorLine1="            if (mImpl.hasSize()) {"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/wear/tiles/LayoutElementBuilders.java"/>
-    </issue>
-
-    <issue
-        id="RestrictedApiAndroidX"
-        message="FontStyle.getSize can only be called from within the same library group (referenced groupId=`androidx.wear.protolayout` from groupId=`androidx.wear.tiles`)"
-        errorLine1="                return DimensionBuilders.SpProp.fromProto(mImpl.getSize());"
-        errorLine2="                                                                ~~~~~~~">
+        message="FontStyle.getSizeList can only be called from within the same library group (referenced groupId=`androidx.wear.protolayout` from groupId=`androidx.wear.tiles`)"
+        errorLine1="            List&lt;DimensionProto.SpProp> sizes = mImpl.getSizeList();"
+        errorLine2="                                                      ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/wear/tiles/LayoutElementBuilders.java"/>
     </issue>
@@ -1947,8 +1938,17 @@
 
     <issue
         id="RestrictedApiAndroidX"
-        message="Builder.setSize can only be called from within the same library group (referenced groupId=`androidx.wear.protolayout` from groupId=`androidx.wear.tiles`)"
-        errorLine1="                mImpl.setSize(size.toProto());"
+        message="Builder.clearSize can only be called from within the same library group (referenced groupId=`androidx.wear.protolayout` from groupId=`androidx.wear.tiles`)"
+        errorLine1="                mImpl.clearSize();"
+        errorLine2="                      ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/wear/tiles/LayoutElementBuilders.java"/>
+    </issue>
+
+    <issue
+        id="RestrictedApiAndroidX"
+        message="Builder.addSize can only be called from within the same library group (referenced groupId=`androidx.wear.protolayout` from groupId=`androidx.wear.tiles`)"
+        errorLine1="                mImpl.addSize(size.toProto());"
         errorLine2="                      ~~~~~~~">
         <location
             file="src/main/java/androidx/wear/tiles/LayoutElementBuilders.java"/>
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 a089888..259bddf 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
@@ -31,6 +31,7 @@
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.AlignmentProto;
+import androidx.wear.protolayout.proto.DimensionProto;
 import androidx.wear.protolayout.proto.FingerprintProto;
 import androidx.wear.protolayout.proto.FingerprintProto.TreeFingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
@@ -622,8 +623,9 @@
          */
         @Nullable
         public DimensionBuilders.SpProp getSize() {
-            if (mImpl.hasSize()) {
-                return DimensionBuilders.SpProp.fromProto(mImpl.getSize());
+            List<DimensionProto.SpProp> sizes = mImpl.getSizeList();
+            if (!sizes.isEmpty()) {
+                return DimensionBuilders.SpProp.fromProto(sizes.get(0));
             } else {
                 return null;
             }
@@ -744,7 +746,8 @@
              */
             @NonNull
             public Builder setSize(@NonNull DimensionBuilders.SpProp size) {
-                mImpl.setSize(size.toProto());
+                mImpl.clearSize();
+                mImpl.addSize(size.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(size.getFingerprint()).aggregateValueAsInt());
                 return this;
diff --git a/wear/watchface/watchface-client-guava/api/api_lint.ignore b/wear/watchface/watchface-client-guava/api/api_lint.ignore
index b966a0a..2449cb9 100644
--- a/wear/watchface/watchface-client-guava/api/api_lint.ignore
+++ b/wear/watchface/watchface-client-guava/api/api_lint.ignore
@@ -3,7 +3,3 @@
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion#createWatchFaceControlClient(android.content.Context, String):
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
-
-
-ListenerLast: androidx.wear.watchface.client.ListenableWatchFaceControlClient#getOrCreateInteractiveWatchFaceClient(String, androidx.wear.watchface.client.DeviceConfig, androidx.wear.watchface.client.WatchUiState, androidx.wear.watchface.style.UserStyleData, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>, java.util.concurrent.Executor, androidx.wear.watchface.client.WatchFaceControlClient.PreviewImageUpdateRequestedListener, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient>) parameter #7:
-    Listeners should always be at end of argument list (method `getOrCreateInteractiveWatchFaceClient`)
diff --git a/wear/wear/api/api_lint.ignore b/wear/wear/api/api_lint.ignore
index 61244fa..4784ca5 100644
--- a/wear/wear/api/api_lint.ignore
+++ b/wear/wear/api/api_lint.ignore
@@ -33,8 +33,6 @@
 
 InvalidNullabilityOverride: androidx.wear.widget.ArcLayout#checkLayoutParams(android.view.ViewGroup.LayoutParams) parameter #0:
     Invalid nullability on parameter `p` in method `checkLayoutParams`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.wear.widget.ArcLayout#drawChild(android.graphics.Canvas, android.view.View, long) parameter #0:
-    Invalid nullability on parameter `canvas` in method `drawChild`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.wear.widget.ArcLayout#drawChild(android.graphics.Canvas, android.view.View, long) parameter #1:
     Invalid nullability on parameter `child` in method `drawChild`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.wear.widget.ArcLayout#generateLayoutParams(android.util.AttributeSet) parameter #0:
@@ -45,10 +43,6 @@
     Invalid nullability on parameter `event` in method `onInterceptTouchEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.wear.widget.ArcLayout#onTouchEvent(android.view.MotionEvent) parameter #0:
     Invalid nullability on parameter `event` in method `onTouchEvent`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.wear.widget.CurvedTextView#draw(android.graphics.Canvas) parameter #0:
-    Invalid nullability on parameter `canvas` in method `draw`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-InvalidNullabilityOverride: androidx.wear.widget.CurvedTextView#onDraw(android.graphics.Canvas) parameter #0:
-    Invalid nullability on parameter `canvas` in method `onDraw`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.wear.widget.CurvedTextView#onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo) parameter #0:
     Invalid nullability on parameter `info` in method `onInitializeAccessibilityNodeInfo`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: androidx.wear.widget.CurvedTextView#onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent) parameter #0:
diff --git a/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatUserAgentMetadataTest.java b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatUserAgentMetadataTest.java
index 86f4dd9..d7f9d73 100644
--- a/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatUserAgentMetadataTest.java
+++ b/webkit/integration-tests/instrumentation/src/androidTest/java/androidx/webkit/WebSettingsCompatUserAgentMetadataTest.java
@@ -18,6 +18,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 
 
 import android.os.Build;
@@ -153,6 +154,38 @@
     }
 
     @Test
+    public void testSetUserAgentMetadataExplicitlyDefault() throws Throwable {
+        WebkitUtils.checkFeature(WebViewFeature.USER_AGENT_METADATA);
+
+        WebSettings settings = mWebViewOnUiThread.getSettings();
+        UserAgentMetadata uaMetadata = new UserAgentMetadata.Builder()
+                .setBrandVersionList(new ArrayList<>())
+                .setArchitecture(null)
+                .setFullVersion(null)
+                .setPlatform(null)
+                .setPlatformVersion(null)
+                .setModel(null).build();
+        WebSettingsCompat.setUserAgentMetadata(settings, uaMetadata);
+
+        UserAgentMetadata userAgentMetadata = WebSettingsCompat.getUserAgentMetadata(settings);
+        // Check brand version list.
+        List<String> brands = new ArrayList<>();
+        Assert.assertNotNull(userAgentMetadata.getBrandVersionList());
+        for (UserAgentMetadata.BrandVersion bv : userAgentMetadata.getBrandVersionList()) {
+            brands.add(bv.getBrand());
+        }
+        Assert.assertTrue("The default brand should contains Android WebView.",
+                brands.contains("Android WebView"));
+        assertEquals("The default platform is Android.", "Android",
+                userAgentMetadata.getPlatform());
+        assertNotNull(userAgentMetadata.getArchitecture());
+        assertNotNull(userAgentMetadata.getFullVersion());
+        assertNotNull(userAgentMetadata.getPlatform());
+        assertNotNull(userAgentMetadata.getPlatformVersion());
+        assertNotNull(userAgentMetadata.getModel());
+    }
+
+    @Test
     public void testSetUserAgentMetadataDefaultHttpHeader() throws Throwable {
         WebkitUtils.checkFeature(WebViewFeature.USER_AGENT_METADATA);
 
@@ -207,10 +240,10 @@
 
         WebSettings settings = mWebViewOnUiThread.getSettings();
         // Overrides user-agent metadata.
+        UserAgentMetadata.BrandVersion brandVersion = new UserAgentMetadata.BrandVersion.Builder()
+                .setBrand("myBrand").setMajorVersion("1").setFullVersion("1.1.1.1").build();
         UserAgentMetadata overrideSetting = new UserAgentMetadata.Builder()
-                .setBrandVersionList(Collections.singletonList(
-                        new UserAgentMetadata.BrandVersion(
-                                "myBrand", "1", "1.1.1.1")))
+                .setBrandVersionList(Collections.singletonList(brandVersion))
                 .setFullVersion("1.1.1.1")
                 .setPlatform("myPlatform").setPlatformVersion("2.2.2.2").setArchitecture("myArch")
                 .setMobile(true).setModel("myModel").setBitness(32)
@@ -232,10 +265,10 @@
         settings.setJavaScriptEnabled(true);
 
         // Overrides user-agent metadata.
+        UserAgentMetadata.BrandVersion brandVersion = new UserAgentMetadata.BrandVersion.Builder()
+                .setBrand("myBrand").setMajorVersion("1").setFullVersion("1.1.1.1").build();
         UserAgentMetadata overrideSetting = new UserAgentMetadata.Builder()
-                .setBrandVersionList(Collections.singletonList(
-                        new UserAgentMetadata.BrandVersion(
-                                "myBrand", "1", "1.1.1.1")))
+                .setBrandVersionList(Collections.singletonList(brandVersion))
                 .setFullVersion("1.1.1.1").setPlatform("myPlatform")
                 .setPlatformVersion("2.2.2.2").setArchitecture("myArch")
                 .setMobile(true).setModel("myModel").setBitness(32)
@@ -294,10 +327,10 @@
 
         WebSettings settings = mWebViewOnUiThread.getSettings();
         // Overrides without setting user-agent metadata platform and bitness.
+        UserAgentMetadata.BrandVersion brandVersion = new UserAgentMetadata.BrandVersion.Builder()
+                .setBrand("myBrand").setMajorVersion("1").setFullVersion("1.1.1.1").build();
         UserAgentMetadata overrideSetting = new UserAgentMetadata.Builder()
-                .setBrandVersionList(Collections.singletonList(
-                        new UserAgentMetadata.BrandVersion(
-                                "myBrand", "1", "1.1.1.1")))
+                .setBrandVersionList(Collections.singletonList(brandVersion))
                 .setFullVersion("1.1.1.1")
                 .setPlatformVersion("2.2.2.2").setArchitecture("myArch").setMobile(true)
                 .setModel("myModel").setWow64(false).build();
@@ -320,10 +353,10 @@
         settings.setJavaScriptEnabled(true);
 
         // Overrides without setting user-agent metadata platform and bitness.
+        UserAgentMetadata.BrandVersion brandVersion = new UserAgentMetadata.BrandVersion.Builder()
+                .setBrand("myBrand").setMajorVersion("1").setFullVersion("1.1.1.1").build();
         UserAgentMetadata overrideSetting = new UserAgentMetadata.Builder()
-                .setBrandVersionList(Collections.singletonList(
-                        new UserAgentMetadata.BrandVersion(
-                                "myBrand", "1", "1.1.1.1")))
+                .setBrandVersionList(Collections.singletonList(brandVersion))
                 .setFullVersion("1.1.1.1").setPlatformVersion("2.2.2.2")
                 .setArchitecture("myArch").setMobile(true).setModel("myModel").setWow64(false)
                 .build();
@@ -377,30 +410,27 @@
 
         try {
             WebSettings settings = mWebViewOnUiThread.getSettings();
+            UserAgentMetadata.BrandVersion brandVersion = new UserAgentMetadata.BrandVersion
+                    .Builder().setBrand("myBrand").build();
             UserAgentMetadata uaMetadata = new UserAgentMetadata.Builder()
-                    .setBrandVersionList(Collections.singletonList(
-                            new UserAgentMetadata.BrandVersion(
-                                    "", "", ""))).build();
+                    .setBrandVersionList(Collections.singletonList(brandVersion)).build();
             WebSettingsCompat.setUserAgentMetadata(settings, uaMetadata);
             Assert.fail("Should have thrown exception.");
-        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
             Assert.assertEquals("Brand name, major version and full version should not "
-                    + "be blank.", e.getMessage());
+                    + "be null or blank.", e.getMessage());
         }
-    }
-
-    @Test
-    public void testSetUserAgentMetadataEmptyBrandVersionList() throws Throwable {
-        WebkitUtils.checkFeature(WebViewFeature.USER_AGENT_METADATA);
 
         try {
             WebSettings settings = mWebViewOnUiThread.getSettings();
+            UserAgentMetadata.BrandVersion brandVersion = new UserAgentMetadata.BrandVersion
+                    .Builder().setBrand("").build();
             UserAgentMetadata uaMetadata = new UserAgentMetadata.Builder()
-                    .setBrandVersionList(new ArrayList<>()).build();
+                    .setBrandVersionList(Collections.singletonList(brandVersion)).build();
             WebSettingsCompat.setUserAgentMetadata(settings, uaMetadata);
             Assert.fail("Should have thrown exception.");
         } catch (IllegalArgumentException e) {
-            Assert.assertEquals("Brand version list should not be empty.", e.getMessage());
+            Assert.assertEquals("Brand should not be blank.", e.getMessage());
         }
     }
 
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/UserAgentMetadataActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/UserAgentMetadataActivity.java
index e1213a7..e3c908f 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/UserAgentMetadataActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/UserAgentMetadataActivity.java
@@ -109,10 +109,11 @@
     private void refreshView(boolean setOverrides) {
         UserAgentMetadata overrideSetting;
         if (setOverrides) {
+            UserAgentMetadata.BrandVersion brandVersion = new UserAgentMetadata.BrandVersion
+                    .Builder().setBrand("myBrand").setMajorVersion("1").setFullVersion("1.1.1.1")
+                    .build();
             overrideSetting = new UserAgentMetadata.Builder()
-                    .setBrandVersionList(Collections.singletonList(
-                            new UserAgentMetadata.BrandVersion(
-                                    "myBrand", "1", "1.1.1.1")))
+                    .setBrandVersionList(Collections.singletonList(brandVersion))
                     .setFullVersion("1.1.1.1").setPlatform("myPlatform")
                     .setPlatformVersion("2.2.2.2").setArchitecture("myArch")
                     .setMobile(true).setModel("myModel").setBitness(32)
diff --git a/webkit/webkit/api/api_lint.ignore b/webkit/webkit/api/api_lint.ignore
index 15a029d..f0dc80d 100644
--- a/webkit/webkit/api/api_lint.ignore
+++ b/webkit/webkit/api/api_lint.ignore
@@ -69,6 +69,12 @@
     androidx.webkit.WebViewAssetLoader does not declare a `isHttpAllowed()` method matching method androidx.webkit.WebViewAssetLoader.Builder.setHttpAllowed(boolean)
 
 
+NotCloseable: androidx.webkit.TracingController:
+    Classes that release resources (stop()) should implement AutoCloseable and CloseGuard: class androidx.webkit.TracingController
+NotCloseable: androidx.webkit.WebMessagePortCompat:
+    Classes that release resources (close()) should implement AutoCloseable and CloseGuard: class androidx.webkit.WebMessagePortCompat
+
+
 NullableCollection: androidx.webkit.WebMessageCompat#getPorts():
     Return type of method androidx.webkit.WebMessageCompat.getPorts() is a nullable collection (`androidx.webkit.WebMessagePortCompat[]`); must be non-null
 
diff --git a/webkit/webkit/api/current.txt b/webkit/webkit/api/current.txt
index a747afd..c7ac4d8 100644
--- a/webkit/webkit/api/current.txt
+++ b/webkit/webkit/api/current.txt
@@ -147,7 +147,7 @@
   public final class UserAgentMetadata {
     method public String? getArchitecture();
     method public int getBitness();
-    method public java.util.List<androidx.webkit.UserAgentMetadata.BrandVersion!>? getBrandVersionList();
+    method public java.util.List<androidx.webkit.UserAgentMetadata.BrandVersion!> getBrandVersionList();
     method public String? getFullVersion();
     method public String? getModel();
     method public String? getPlatform();
@@ -158,24 +158,32 @@
   }
 
   public static final class UserAgentMetadata.BrandVersion {
-    ctor public UserAgentMetadata.BrandVersion(String, String, String);
     method public String getBrand();
     method public String getFullVersion();
     method public String getMajorVersion();
   }
 
+  public static final class UserAgentMetadata.BrandVersion.Builder {
+    ctor public UserAgentMetadata.BrandVersion.Builder();
+    ctor public UserAgentMetadata.BrandVersion.Builder(androidx.webkit.UserAgentMetadata.BrandVersion);
+    method public androidx.webkit.UserAgentMetadata.BrandVersion build();
+    method public androidx.webkit.UserAgentMetadata.BrandVersion.Builder setBrand(String);
+    method public androidx.webkit.UserAgentMetadata.BrandVersion.Builder setFullVersion(String);
+    method public androidx.webkit.UserAgentMetadata.BrandVersion.Builder setMajorVersion(String);
+  }
+
   public static final class UserAgentMetadata.Builder {
     ctor public UserAgentMetadata.Builder();
     ctor public UserAgentMetadata.Builder(androidx.webkit.UserAgentMetadata);
     method public androidx.webkit.UserAgentMetadata build();
-    method public androidx.webkit.UserAgentMetadata.Builder setArchitecture(String);
+    method public androidx.webkit.UserAgentMetadata.Builder setArchitecture(String?);
     method public androidx.webkit.UserAgentMetadata.Builder setBitness(int);
     method public androidx.webkit.UserAgentMetadata.Builder setBrandVersionList(java.util.List<androidx.webkit.UserAgentMetadata.BrandVersion!>);
-    method public androidx.webkit.UserAgentMetadata.Builder setFullVersion(String);
+    method public androidx.webkit.UserAgentMetadata.Builder setFullVersion(String?);
     method public androidx.webkit.UserAgentMetadata.Builder setMobile(boolean);
-    method public androidx.webkit.UserAgentMetadata.Builder setModel(String);
-    method public androidx.webkit.UserAgentMetadata.Builder setPlatform(String);
-    method public androidx.webkit.UserAgentMetadata.Builder setPlatformVersion(String);
+    method public androidx.webkit.UserAgentMetadata.Builder setModel(String?);
+    method public androidx.webkit.UserAgentMetadata.Builder setPlatform(String?);
+    method public androidx.webkit.UserAgentMetadata.Builder setPlatformVersion(String?);
     method public androidx.webkit.UserAgentMetadata.Builder setWow64(boolean);
   }
 
diff --git a/webkit/webkit/api/restricted_current.txt b/webkit/webkit/api/restricted_current.txt
index a747afd..c7ac4d8 100644
--- a/webkit/webkit/api/restricted_current.txt
+++ b/webkit/webkit/api/restricted_current.txt
@@ -147,7 +147,7 @@
   public final class UserAgentMetadata {
     method public String? getArchitecture();
     method public int getBitness();
-    method public java.util.List<androidx.webkit.UserAgentMetadata.BrandVersion!>? getBrandVersionList();
+    method public java.util.List<androidx.webkit.UserAgentMetadata.BrandVersion!> getBrandVersionList();
     method public String? getFullVersion();
     method public String? getModel();
     method public String? getPlatform();
@@ -158,24 +158,32 @@
   }
 
   public static final class UserAgentMetadata.BrandVersion {
-    ctor public UserAgentMetadata.BrandVersion(String, String, String);
     method public String getBrand();
     method public String getFullVersion();
     method public String getMajorVersion();
   }
 
+  public static final class UserAgentMetadata.BrandVersion.Builder {
+    ctor public UserAgentMetadata.BrandVersion.Builder();
+    ctor public UserAgentMetadata.BrandVersion.Builder(androidx.webkit.UserAgentMetadata.BrandVersion);
+    method public androidx.webkit.UserAgentMetadata.BrandVersion build();
+    method public androidx.webkit.UserAgentMetadata.BrandVersion.Builder setBrand(String);
+    method public androidx.webkit.UserAgentMetadata.BrandVersion.Builder setFullVersion(String);
+    method public androidx.webkit.UserAgentMetadata.BrandVersion.Builder setMajorVersion(String);
+  }
+
   public static final class UserAgentMetadata.Builder {
     ctor public UserAgentMetadata.Builder();
     ctor public UserAgentMetadata.Builder(androidx.webkit.UserAgentMetadata);
     method public androidx.webkit.UserAgentMetadata build();
-    method public androidx.webkit.UserAgentMetadata.Builder setArchitecture(String);
+    method public androidx.webkit.UserAgentMetadata.Builder setArchitecture(String?);
     method public androidx.webkit.UserAgentMetadata.Builder setBitness(int);
     method public androidx.webkit.UserAgentMetadata.Builder setBrandVersionList(java.util.List<androidx.webkit.UserAgentMetadata.BrandVersion!>);
-    method public androidx.webkit.UserAgentMetadata.Builder setFullVersion(String);
+    method public androidx.webkit.UserAgentMetadata.Builder setFullVersion(String?);
     method public androidx.webkit.UserAgentMetadata.Builder setMobile(boolean);
-    method public androidx.webkit.UserAgentMetadata.Builder setModel(String);
-    method public androidx.webkit.UserAgentMetadata.Builder setPlatform(String);
-    method public androidx.webkit.UserAgentMetadata.Builder setPlatformVersion(String);
+    method public androidx.webkit.UserAgentMetadata.Builder setModel(String?);
+    method public androidx.webkit.UserAgentMetadata.Builder setPlatform(String?);
+    method public androidx.webkit.UserAgentMetadata.Builder setPlatformVersion(String?);
     method public androidx.webkit.UserAgentMetadata.Builder setWow64(boolean);
   }
 
diff --git a/webkit/webkit/src/main/java/androidx/webkit/UserAgentMetadata.java b/webkit/webkit/src/main/java/androidx/webkit/UserAgentMetadata.java
index f799f505..1517f41 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/UserAgentMetadata.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/UserAgentMetadata.java
@@ -16,12 +16,11 @@
 
 package androidx.webkit;
 
-import android.annotation.SuppressLint;
-
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
@@ -51,7 +50,7 @@
     private boolean mWow64 = false;
 
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    private UserAgentMetadata(@Nullable List<BrandVersion> brandVersionList,
+    private UserAgentMetadata(@NonNull List<BrandVersion> brandVersionList,
             @Nullable String fullVersion, @Nullable String platform,
             @Nullable String platformVersion, @Nullable String architecture,
             @Nullable String model,
@@ -77,8 +76,7 @@
      * @see Builder#setBrandVersionList
      *
      */
-    @SuppressLint("NullableCollection")
-    @Nullable
+    @NonNull
     public List<BrandVersion> getBrandVersionList() {
         return mBrandVersionList;
     }
@@ -211,13 +209,9 @@
         private final String mMajorVersion;
         private final String mFullVersion;
 
-        public BrandVersion(@NonNull String brand, @NonNull String majorVersion,
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        private BrandVersion(@NonNull String brand, @NonNull String majorVersion,
                 @NonNull String fullVersion) {
-            if (brand.trim().isEmpty() || majorVersion.trim().isEmpty()
-                    || fullVersion.trim().isEmpty()) {
-                throw new IllegalArgumentException("Brand name, major version and full version "
-                        + "should not be blank.");
-            }
             mBrand = brand;
             mMajorVersion = majorVersion;
             mFullVersion = fullVersion;
@@ -273,6 +267,106 @@
         public int hashCode() {
             return Objects.hash(mBrand, mMajorVersion, mFullVersion);
         }
+
+        /**
+         * Builder used to create {@link BrandVersion} objects.
+         * <p>
+         * Examples:
+         * <pre class="prettyprint">
+         *  // Create a setting with a brand version contains brand name: myBrand,
+         *  // major version: 100, full version: 100.1.1.1.
+         *  new BrandVersion.Builder().setBrand("myBrand")
+         *                            .setMajorVersion("100")
+         *                            .setFullVersion("100.1.1.1")
+         *                            .build();
+         * </pre>
+         */
+        public static final class Builder {
+            private String mBrand;
+            private String mMajorVersion;
+            private String mFullVersion;
+
+            /**
+             * Create an empty BrandVersion Builder.
+             */
+            public Builder() {
+            }
+
+            /**
+             * Create a BrandVersion Builder from an existing BrandVersion object.
+             */
+            public Builder(@NonNull BrandVersion brandVersion) {
+                mBrand = brandVersion.getBrand();
+                mMajorVersion = brandVersion.getMajorVersion();
+                mFullVersion = brandVersion.getFullVersion();
+            }
+
+            /**
+             * Builds the current brand, majorVersion and fullVersion into a BrandVersion object.
+             *
+             * @return The BrandVersion object represented by this Builder.
+             * @throws IllegalStateException If any of the value in brand, majorVersion and
+             *                               fullVersion is null or blank.
+             */
+            @NonNull
+            public BrandVersion build() {
+                if (mBrand == null || mBrand.trim().isEmpty()
+                        || mMajorVersion == null || mMajorVersion.trim().isEmpty()
+                        || mFullVersion == null || mFullVersion.trim().isEmpty()) {
+                    throw new IllegalStateException("Brand name, major version and full version "
+                            + "should not be null or blank.");
+                }
+                return new BrandVersion(mBrand, mMajorVersion, mFullVersion);
+            }
+
+            /**
+             * Sets the BrandVersion's brand. The brand should not be blank.
+             *
+             * @param brand The brand is used to generate user-agent client hint
+             *              {@code sec-ch-ua} and {@code sec-ch-ua-full-version-list}.
+             *
+             */
+            @NonNull
+            public BrandVersion.Builder setBrand(@NonNull String brand) {
+                if (brand.trim().isEmpty()) {
+                    throw new IllegalArgumentException("Brand should not be blank.");
+                }
+                mBrand = brand;
+                return this;
+            }
+
+            /**
+             * Sets the BrandVersion's majorVersion. The majorVersion should not be blank.
+             *
+             * @param majorVersion The majorVersion is used to generate user-agent client hint
+             *                     {@code sec-ch-ua}.
+             *
+             */
+            @NonNull
+            public BrandVersion.Builder setMajorVersion(@NonNull String majorVersion) {
+                if (majorVersion.trim().isEmpty()) {
+                    throw new IllegalArgumentException("MajorVersion should not be blank.");
+                }
+                mMajorVersion = majorVersion;
+                return this;
+            }
+
+            /**
+             * Sets the BrandVersion's fullVersion. The fullVersion should not be blank.
+             *
+             * @param fullVersion The brand is used to generate user-agent client hint
+             *                    {@code sec-ch-ua-full-version-list}.
+             *
+             */
+            @NonNull
+            public BrandVersion.Builder setFullVersion(@NonNull String fullVersion) {
+                if (fullVersion.trim().isEmpty()) {
+                    throw new IllegalArgumentException("FullVersion should not be blank.");
+                }
+                mFullVersion = fullVersion;
+                return this;
+            }
+        }
     }
 
     /**
@@ -280,25 +374,28 @@
      * <p>
      * Examples:
      * <pre class="prettyprint">
-     *   // Create a setting with default options.
-     *   new UserAgentMetadata.Builder().build();
+     *  // Create a setting with default options.
+     *  new UserAgentMetadata.Builder().build();
      *
-     *   // Create a setting with a brand version contains brand name: myBrand, major version: 100,
-     *   // full version: 100.1.1.1.
-     *   new UserAgentMetadata.Builder().setBrandVersionList(
-     *   Collections.singletonList(new BrandVersion("myBrand", "100", "100.1.1.1"))).build();
+     *  // Create a setting with a brand version contains brand name: myBrand, major version: 100,
+     *  // full version: 100.1.1.1.
+     *  BrandVersion brandVersion = new BrandVersion.Builder().setBrand("myBrand")
+     *                                                        .setMajorVersion("100")
+     *                                                        .setFullVersion("100.1.1.1")
+     *                                                        .build();
+     *  new UserAgentMetadata.Builder().setBrandVersionList(Collections.singletonList(brandVersion))
+     *                                 .build();
      *
-     *   // Create a setting brand version, platform, platform version and bitness.
-     *   new UserAgentMetadata.Builder().setBrandVersionList(
-     *   Collections.singletonList(new BrandVersion("myBrand", "100", "100.1.1.1")))
-     *                                        .setPlatform("myPlatform")
-     *                                        .setPlatform("1.1.1.1")
-     *                                        .setBitness(BITNESS_64)
-     *                                        .build();
+     *  // Create a setting brand version, platform, platform version and bitness.
+     *  new UserAgentMetadata.Builder().setBrandVersionList(Collections.singletonList(brandVersion))
+     *                                 .setPlatform("myPlatform")
+     *                                 .setPlatform("1.1.1.1")
+     *                                 .setBitness(BITNESS_64)
+     *                                 .build();
      * </pre>
      */
     public static final class Builder {
-        private List<BrandVersion> mBrandVersionList;
+        private List<BrandVersion> mBrandVersionList = new ArrayList<>();
         private String mFullVersion;
         private String mPlatform;
         private String mPlatformVersion;
@@ -342,8 +439,8 @@
 
         /**
          * Sets user-agent metadata brands and their versions. The brand name, major version and
-         * full version should not be blank. The default value is null which means the system
-         * default user-agent metadata brands and versions will be used to generate the
+         * full version should not be blank. The default value is an empty list which means the
+         * system default user-agent metadata brands and versions will be used to generate the
          * user-agent client hints.
          *
          * @param brandVersions a list of {@link BrandVersion} used to generated user-agent client
@@ -352,9 +449,6 @@
          */
         @NonNull
         public Builder setBrandVersionList(@NonNull List<BrandVersion> brandVersions) {
-            if (brandVersions.isEmpty()) {
-                throw new IllegalArgumentException("Brand version list should not be empty.");
-            }
             mBrandVersionList = brandVersions;
             return this;
         }
@@ -362,16 +456,21 @@
         /**
          * Sets the user-agent metadata full version. The full version should not be blank, even
          * though the <a href="https://wicg.github.io/ua-client-hints">spec<a/> about brand full
-         * version could be empty. The blank full version could cause inconsistent brands when
-         * generating brand version related user-agent client hints. It also gives bad experience
-         * for developers when processing the brand full version.
+         * version could be empty. A blank full version could cause inconsistent brands when
+         * generating brand version related user-agent client hints. It also provides a bad
+         * experience for developers when processing the brand full version. If null is provided,
+         * the system default value will be used to generate the client hint.
          *
          * @param fullVersion The full version is used to generate user-agent client hint
          *                    {@code sec-ch-ua-full-version}.
          *
          */
         @NonNull
-        public Builder setFullVersion(@NonNull String fullVersion) {
+        public Builder setFullVersion(@Nullable String fullVersion) {
+            if (fullVersion == null) {
+                mFullVersion = null;
+                return this;
+            }
             if (fullVersion.trim().isEmpty()) {
                 throw new IllegalArgumentException("Full version should not be blank.");
             }
@@ -380,14 +479,19 @@
         }
 
         /**
-         * Sets the user-agent metadata platform. The platform should not be blank.
+         * Sets the user-agent metadata platform. The platform should not be blank. If null is
+         * provided, the system default value will be used to generate the client hint.
          *
          * @param platform The platform is used to generate user-agent client hint
          *                 {@code sec-ch-ua-platform}.
          *
          */
         @NonNull
-        public Builder setPlatform(@NonNull String platform) {
+        public Builder setPlatform(@Nullable String platform) {
+            if (platform == null) {
+                mPlatform = null;
+                return this;
+            }
             if (platform.trim().isEmpty()) {
                 throw new IllegalArgumentException("Platform should not be blank.");
             }
@@ -396,42 +500,43 @@
         }
 
         /**
-         * Sets the user-agent metadata platform version. The value should not be null but can be
-         * empty string.
+         * Sets the user-agent metadata platform version. If null is provided, the system default
+         * value will be used to generate the client hint.
          *
          * @param platformVersion The platform version is used to generate user-agent client
          *                        hint {@code sec-ch-ua-platform-version}.
          *
          */
         @NonNull
-        public Builder setPlatformVersion(@NonNull String platformVersion) {
+        public Builder setPlatformVersion(@Nullable String platformVersion) {
             mPlatformVersion = platformVersion;
             return this;
         }
 
         /**
-         * Sets the user-agent metadata architecture. The value should not be null but can be
-         * empty string.
+         * Sets the user-agent metadata architecture. If null is provided, the system default
+         * value will be used to generate the client hint.
          *
          * @param architecture The architecture is used to generate user-agent client hint
          *                     {@code sec-ch-ua-arch}.
          *
          */
         @NonNull
-        public Builder setArchitecture(@NonNull String architecture) {
+        public Builder setArchitecture(@Nullable String architecture) {
             mArchitecture = architecture;
             return this;
         }
 
         /**
-         * Sets the user-agent metadata model. The value should not be null but can be empty string.
+         * Sets the user-agent metadata model. If null is provided, the system default value will
+         * be used to generate the client hint.
          *
          * @param model The model is used to generate user-agent client hint
          *              {@code sec-ch-ua-model}.
          *
          */
         @NonNull
-        public Builder setModel(@NonNull String model) {
+        public Builder setModel(@Nullable String model) {
             mModel = model;
             return this;
         }
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/UserAgentMetadataInternal.java b/webkit/webkit/src/main/java/androidx/webkit/internal/UserAgentMetadataInternal.java
index dfd9747..d238bc1 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/UserAgentMetadataInternal.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/UserAgentMetadataInternal.java
@@ -117,7 +117,9 @@
 
     private static String[][] getBrandVersionArray(
             List<UserAgentMetadata.BrandVersion> brandVersionList) {
-        if (brandVersionList == null) {
+        // If user's input of brand version list is empty, we consider to use system default value.
+        // This means passing null to chromium.
+        if (brandVersionList == null || brandVersionList.isEmpty()) {
             return null;
         }
 
@@ -145,12 +147,15 @@
         Object brandVersionValue = uaMetadataMap.get(BRAND_VERSION_LIST);
         if (brandVersionValue != null) {
             String[][] overrideBrandVersionList = (String[][]) brandVersionValue;
-            List<UserAgentMetadata.BrandVersion> branVersionList = new ArrayList<>();
+            List<UserAgentMetadata.BrandVersion> brandVersionList = new ArrayList<>();
             for (String[] brandVersionInfo : overrideBrandVersionList) {
-                branVersionList.add(new UserAgentMetadata.BrandVersion(brandVersionInfo[0],
-                        brandVersionInfo[1], brandVersionInfo[2]));
+                brandVersionList.add(new UserAgentMetadata.BrandVersion.Builder()
+                        .setBrand(brandVersionInfo[0])
+                        .setMajorVersion(brandVersionInfo[1])
+                        .setFullVersion(brandVersionInfo[2])
+                        .build());
             }
-            builder.setBrandVersionList(branVersionList);
+            builder.setBrandVersionList(brandVersionList);
         }
 
         String fullVersion = (String) uaMetadataMap.get(FULL_VERSION);
diff --git a/window/window-demos/demo-second-app/lint-baseline.xml b/window/window-demos/demo-second-app/lint-baseline.xml
new file mode 100644
index 0000000..34bc125
--- /dev/null
+++ b/window/window-demos/demo-second-app/lint-baseline.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="NotificationPermission"
+        message="When targeting Android 13 or higher, posting a permission requires holding the `POST_NOTIFICATIONS` permission (usage from leakcanary.NotificationEventListener)">
+        <location
+            file="src/main/AndroidManifest.xml"/>
+    </issue>
+
+</issues>
diff --git a/window/window-rxjava2/api/api_lint.ignore b/window/window-rxjava2/api/api_lint.ignore
deleted file mode 100644
index 636cfcc..0000000
--- a/window/window-rxjava2/api/api_lint.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-ContextFirst: androidx.window.rxjava2.layout.WindowInfoTrackerRx#windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.content.Context) parameter #1:
-    Context is distinct, so it must be the first argument (method `windowLayoutInfoFlowable`)
-ContextFirst: androidx.window.rxjava2.layout.WindowInfoTrackerRx#windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.content.Context) parameter #1:
-    Context is distinct, so it must be the first argument (method `windowLayoutInfoObservable`)
diff --git a/window/window-rxjava3/api/api_lint.ignore b/window/window-rxjava3/api/api_lint.ignore
deleted file mode 100644
index 8c55c33..0000000
--- a/window/window-rxjava3/api/api_lint.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-ContextFirst: androidx.window.rxjava3.layout.WindowInfoTrackerRx#windowLayoutInfoFlowable(androidx.window.layout.WindowInfoTracker, android.content.Context) parameter #1:
-    Context is distinct, so it must be the first argument (method `windowLayoutInfoFlowable`)
-ContextFirst: androidx.window.rxjava3.layout.WindowInfoTrackerRx#windowLayoutInfoObservable(androidx.window.layout.WindowInfoTracker, android.content.Context) parameter #1:
-    Context is distinct, so it must be the first argument (method `windowLayoutInfoObservable`)
diff --git a/window/window-testing/lint-baseline.xml b/window/window-testing/lint-baseline.xml
new file mode 100644
index 0000000..d5df726
--- /dev/null
+++ b/window/window-testing/lint-baseline.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt"/>
+    </issue>
+
+</issues>
diff --git a/window/window/api/api_lint.ignore b/window/window/api/api_lint.ignore
index d427dda..964a9de 100644
--- a/window/window/api/api_lint.ignore
+++ b/window/window/api/api_lint.ignore
@@ -1,9 +1,11 @@
 // Baseline format: 1.0
-ContextFirst: androidx.window.embedding.ActivityEmbeddingOptions#setLaunchingActivityStack(android.app.ActivityOptions, android.content.Context, androidx.window.embedding.ActivityStack) parameter #1:
-    Context is distinct, so it must be the first argument (method `windowLayoutInfoFlowable`)
 GetterSetterNames: field ActivityRule.alwaysExpand:
     Invalid name for boolean property `alwaysExpand`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field SplitAttributesCalculatorParams.areDefaultConstraintsSatisfied:
     Invalid name for boolean property `areDefaultConstraintsSatisfied`. Should start with one of `has`, `can`, `should`, `is`.
 GetterSetterNames: field SplitPairRule.clearTop:
     Invalid name for boolean property `clearTop`. Should start with one of `has`, `can`, `should`, `is`.
+
+
+NotCloseable: androidx.window.area.WindowAreaSession:
+    Classes that release resources (close()) should implement AutoCloseable and CloseGuard: class androidx.window.area.WindowAreaSession
diff --git a/window/window/lint-baseline.xml b/window/window/lint-baseline.xml
new file mode 100644
index 0000000..b2b40e7
--- /dev/null
+++ b/window/window/lint-baseline.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/window/area/utils/DeviceMetrics.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/window/area/utils/DeviceUtils.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/window/area/utils/DeviceMetricsCompatUtils.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 17"
+        errorLine1="@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/window/layout/util/DisplayCompatHelper.kt"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/window/layout/WindowMetricsCalculatorCompat.kt"/>
+    </issue>
+
+</issues>
diff --git a/work/integration-tests/testapp/lint-baseline.xml b/work/integration-tests/testapp/lint-baseline.xml
index 20fb715..2444eb3 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="6" by="lint 8.2.0-beta01" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-beta01)" variant="all" version="8.2.0-beta01">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanThreadSleep"
@@ -20,33 +20,6 @@
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                &amp;&amp; Build.VERSION.SDK_INT >= 16 &amp;&amp; data.getClipData() != null) {"
-        errorLine2="                                                       ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageProcessingActivity.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            int count = data.getClipData().getItemCount();"
-        errorLine2="                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageProcessingActivity.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                String uriString = data.getClipData().getItemAt(i).getUri().toString();"
-        errorLine2="                                        ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageProcessingActivity.java"/>
-    </issue>
-
-    <issue
         id="RestrictedApiAndroidX"
         message="ListenableFutureKt.await can only be called from within the same library group (referenced groupId=`androidx.work` from groupId=`androidx.work.integration-tests`)"
         errorLine1="        remoteWorkManager.enqueue(listOf(request)).await()"
@@ -119,6 +92,24 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageProcessingActivity.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="                &amp;&amp; Build.VERSION.SDK_INT >= 16 &amp;&amp; data.getClipData() != null) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageProcessingActivity.java"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected void onCreate(final Bundle savedInstanceState) {"
diff --git a/work/work-runtime/lint-baseline.xml b/work/work-runtime/lint-baseline.xml
index 8527d1f..27db603 100644
--- a/work/work-runtime/lint-baseline.xml
+++ b/work/work-runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
+<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
 
     <issue
         id="BanSynchronizedMethods"
@@ -182,6 +182,42 @@
     </issue>
 
     <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/work/impl/background/systemalarm/Alarms.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="    @RequiresApi(19)"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/work/impl/background/systemalarm/Alarms.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="            if (Build.VERSION.SDK_INT >= 19) {"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/work/impl/utils/ForceStopRunnable.java"/>
+    </issue>
+
+    <issue
+        id="ObsoleteSdkInt"
+        message="Unnecessary; SDK_INT is always >= 19"
+        errorLine1="        val packageName = if (Build.VERSION.SDK_INT >= 18) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/work/impl/utils/ProcessUtils.kt"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public final void addListener(Runnable listener, Executor executor) {"
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkContinuationImpl.java b/work/work-runtime/src/main/java/androidx/work/impl/WorkContinuationImpl.java
index 481f2a4..8e7b786 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkContinuationImpl.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkContinuationImpl.java
@@ -180,11 +180,8 @@
     @NonNull
     @Override
     public ListenableFuture<List<WorkInfo>> getWorkInfos() {
-        StatusRunnable<List<WorkInfo>> runnable =
-                StatusRunnable.forStringIds(mWorkManagerImpl, mAllIds);
-
-        mWorkManagerImpl.getWorkTaskExecutor().executeOnTaskThread(runnable);
-        return runnable.getFuture();
+        return StatusRunnable.forStringIds(mWorkManagerImpl.getWorkDatabase(),
+                mWorkManagerImpl.getWorkTaskExecutor(), mAllIds);
     }
 
     @Override
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkManagerImpl.java b/work/work-runtime/src/main/java/androidx/work/impl/WorkManagerImpl.java
index aa02965..fb282a9 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkManagerImpl.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkManagerImpl.java
@@ -64,7 +64,7 @@
 import androidx.work.impl.utils.ForceStopRunnable;
 import androidx.work.impl.utils.LiveDataUtils;
 import androidx.work.impl.utils.PreferenceUtils;
-import androidx.work.impl.utils.PruneWorkRunnable;
+import androidx.work.impl.utils.PruneWorkRunnableKt;
 import androidx.work.impl.utils.RawQueries;
 import androidx.work.impl.utils.StatusRunnable;
 import androidx.work.impl.utils.StopWorkRunnable;
@@ -466,9 +466,7 @@
 
     @Override
     public @NonNull Operation pruneWork() {
-        PruneWorkRunnable runnable = new PruneWorkRunnable(this);
-        mWorkTaskExecutor.executeOnTaskThread(runnable);
-        return runnable.getOperation();
+        return PruneWorkRunnableKt.pruneWork(mWorkDatabase, mWorkTaskExecutor);
     }
 
     @Override
@@ -498,9 +496,7 @@
 
     @Override
     public @NonNull ListenableFuture<WorkInfo> getWorkInfoById(@NonNull UUID id) {
-        StatusRunnable<WorkInfo> runnable = StatusRunnable.forUUID(this, id);
-        mWorkTaskExecutor.getSerialTaskExecutor().execute(runnable);
-        return runnable.getFuture();
+        return StatusRunnable.forUUID(mWorkDatabase, mWorkTaskExecutor, id);
     }
 
     @NonNull
@@ -524,9 +520,7 @@
 
     @Override
     public @NonNull ListenableFuture<List<WorkInfo>> getWorkInfosByTag(@NonNull String tag) {
-        StatusRunnable<List<WorkInfo>> runnable = StatusRunnable.forTag(this, tag);
-        mWorkTaskExecutor.getSerialTaskExecutor().execute(runnable);
-        return runnable.getFuture();
+        return StatusRunnable.forTag(mWorkDatabase, mWorkTaskExecutor, tag);
     }
 
     @Override
@@ -554,10 +548,7 @@
     @NonNull
     public ListenableFuture<List<WorkInfo>> getWorkInfosForUniqueWork(
             @NonNull String uniqueWorkName) {
-        StatusRunnable<List<WorkInfo>> runnable =
-                StatusRunnable.forUniqueWork(this, uniqueWorkName);
-        mWorkTaskExecutor.getSerialTaskExecutor().execute(runnable);
-        return runnable.getFuture();
+        return StatusRunnable.forUniqueWork(mWorkDatabase, mWorkTaskExecutor,  uniqueWorkName);
     }
 
     @NonNull
@@ -584,12 +575,8 @@
 
     @NonNull
     @Override
-    public ListenableFuture<List<WorkInfo>> getWorkInfos(
-            @NonNull WorkQuery workQuery) {
-        StatusRunnable<List<WorkInfo>> runnable =
-                StatusRunnable.forWorkQuerySpec(this, workQuery);
-        mWorkTaskExecutor.getSerialTaskExecutor().execute(runnable);
-        return runnable.getFuture();
+    public ListenableFuture<List<WorkInfo>> getWorkInfos(@NonNull WorkQuery workQuery) {
+        return StatusRunnable.forWorkQuerySpec(mWorkDatabase, mWorkTaskExecutor, workQuery);
     }
 
     @NonNull
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.java
deleted file mode 100644
index 2b1ffcd..0000000
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.work.impl.utils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.work.Operation;
-import androidx.work.impl.OperationImpl;
-import androidx.work.impl.WorkDatabase;
-import androidx.work.impl.WorkManagerImpl;
-import androidx.work.impl.model.WorkSpecDao;
-
-/**
- * A Runnable that prunes work in the background.  Pruned work meets the following criteria:
- * - Is finished (succeeded, failed, or cancelled)
- * - Has zero unfinished dependents
- *
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class PruneWorkRunnable implements Runnable {
-
-    private final WorkManagerImpl mWorkManagerImpl;
-    private final OperationImpl mOperation;
-
-    public PruneWorkRunnable(@NonNull WorkManagerImpl workManagerImpl) {
-        mWorkManagerImpl = workManagerImpl;
-        mOperation = new OperationImpl();
-    }
-
-    /**
-     * @return The {@link Operation} that encapsulates the state of the {@link PruneWorkRunnable}.
-     */
-    @NonNull
-    public Operation getOperation() {
-        return mOperation;
-    }
-
-
-    @Override
-    public void run() {
-        try {
-            WorkDatabase workDatabase = mWorkManagerImpl.getWorkDatabase();
-            WorkSpecDao workSpecDao = workDatabase.workSpecDao();
-            workSpecDao.pruneFinishedWorkWithZeroDependentsIgnoringKeepForAtLeast();
-            mOperation.markState(Operation.SUCCESS);
-        } catch (Throwable exception) {
-            mOperation.markState(new Operation.State.FAILURE(exception));
-        }
-    }
-}
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.kt b/work/work-runtime/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.kt
new file mode 100644
index 0000000..3bc346c
--- /dev/null
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/PruneWorkRunnable.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.work.impl.utils
+
+import androidx.work.Operation
+import androidx.work.impl.OperationImpl
+import androidx.work.impl.WorkDatabase
+import androidx.work.impl.utils.taskexecutor.TaskExecutor
+
+/**
+ * Prunes work in the background.  Pruned work meets the following criteria:
+ * - Is finished (succeeded, failed, or cancelled)
+ * - Has zero unfinished dependents
+ */
+internal fun WorkDatabase.pruneWork(executor: TaskExecutor): Operation {
+    val operation = OperationImpl()
+    executor.executeOnTaskThread {
+        try {
+            workSpecDao().pruneFinishedWorkWithZeroDependentsIgnoringKeepForAtLeast()
+            operation.markState(Operation.SUCCESS)
+        } catch (exception: Throwable) {
+            operation.markState(Operation.State.FAILURE(exception))
+        }
+    }
+    return operation
+}
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/StatusRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/StatusRunnable.java
deleted file mode 100644
index 4a3caeb..0000000
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/StatusRunnable.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.work.impl.utils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.WorkerThread;
-import androidx.work.WorkInfo;
-import androidx.work.WorkQuery;
-import androidx.work.impl.WorkDatabase;
-import androidx.work.impl.WorkManagerImpl;
-import androidx.work.impl.model.WorkSpec;
-import androidx.work.impl.utils.futures.SettableFuture;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.util.List;
-import java.util.UUID;
-
-/**
- * A {@link Runnable} to get {@link WorkInfo}es.
- *
- * @param <T> The expected return type for the {@link ListenableFuture}.
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public abstract class StatusRunnable<T> implements Runnable {
-    private final SettableFuture<T> mFuture = SettableFuture.create();
-
-    @Override
-    public void run() {
-        try {
-            final T value = runInternal();
-            mFuture.set(value);
-        } catch (Throwable throwable) {
-            mFuture.setException(throwable);
-        }
-    }
-
-    @WorkerThread
-    abstract T runInternal();
-
-    @NonNull
-    public ListenableFuture<T> getFuture() {
-        return mFuture;
-    }
-
-    /**
-     * Creates a {@link StatusRunnable} which can get statuses for a given {@link List} of
-     * {@link String} workSpec ids.
-     *
-     * @param workManager The {@link WorkManagerImpl} to use
-     * @param ids         The {@link List} of {@link String} ids
-     * @return an instance of {@link StatusRunnable}
-     */
-    @NonNull
-    public static StatusRunnable<List<WorkInfo>> forStringIds(
-            @NonNull final WorkManagerImpl workManager,
-            @NonNull final List<String> ids) {
-
-        return new StatusRunnable<List<WorkInfo>>() {
-            @Override
-            public List<WorkInfo> runInternal() {
-                WorkDatabase workDatabase = workManager.getWorkDatabase();
-                List<WorkSpec.WorkInfoPojo> workInfoPojos =
-                        workDatabase.workSpecDao().getWorkStatusPojoForIds(ids);
-
-                return WorkSpec.WORK_INFO_MAPPER.apply(workInfoPojos);
-            }
-        };
-    }
-
-    /**
-     * Creates a {@link StatusRunnable} which can get statuses for a specific {@link UUID}
-     * workSpec id.
-     *
-     * @param workManager The {@link WorkManagerImpl} to use
-     * @param id          The workSpec {@link UUID}
-     * @return an instance of {@link StatusRunnable}
-     */
-    @NonNull
-    public static StatusRunnable<WorkInfo> forUUID(
-            @NonNull final WorkManagerImpl workManager,
-            @NonNull final UUID id) {
-
-        return new StatusRunnable<WorkInfo>() {
-            @Override
-            WorkInfo runInternal() {
-                WorkDatabase workDatabase = workManager.getWorkDatabase();
-                WorkSpec.WorkInfoPojo workInfoPojo =
-                        workDatabase.workSpecDao().getWorkStatusPojoForId(id.toString());
-
-                return workInfoPojo != null ? workInfoPojo.toWorkInfo() : null;
-            }
-        };
-    }
-
-    /**
-     * Creates a {@link StatusRunnable} which can get statuses for {@link WorkSpec}s annotated with
-     * the given {@link String} tag.
-     *
-     * @param workManager The {@link WorkManagerImpl} to use
-     * @param tag The {@link String} tag
-     * @return an instance of {@link StatusRunnable}
-     */
-    @NonNull
-    public static StatusRunnable<List<WorkInfo>> forTag(
-            @NonNull final WorkManagerImpl workManager,
-            @NonNull final String tag) {
-
-        return new StatusRunnable<List<WorkInfo>>() {
-            @Override
-            List<WorkInfo> runInternal() {
-                WorkDatabase workDatabase = workManager.getWorkDatabase();
-                List<WorkSpec.WorkInfoPojo> workInfoPojos =
-                        workDatabase.workSpecDao().getWorkStatusPojoForTag(tag);
-
-                return WorkSpec.WORK_INFO_MAPPER.apply(workInfoPojos);
-            }
-        };
-    }
-
-    /**
-     * Creates a {@link StatusRunnable} which can get statuses for {@link WorkSpec}s annotated with
-     * the given {@link String} unique name.
-     *
-     * @param workManager The {@link WorkManagerImpl} to use
-     * @param name The {@link String} unique name
-     * @return an instance of {@link StatusRunnable}
-     */
-    @NonNull
-    public static StatusRunnable<List<WorkInfo>> forUniqueWork(
-            @NonNull final WorkManagerImpl workManager,
-            @NonNull final String name) {
-
-        return new StatusRunnable<List<WorkInfo>>() {
-            @Override
-            List<WorkInfo> runInternal() {
-                WorkDatabase workDatabase = workManager.getWorkDatabase();
-                List<WorkSpec.WorkInfoPojo> workInfoPojos =
-                        workDatabase.workSpecDao().getWorkStatusPojoForName(name);
-
-                return WorkSpec.WORK_INFO_MAPPER.apply(workInfoPojos);
-            }
-        };
-    }
-
-    /**
-     * Creates a {@link StatusRunnable} which can get statuses for {@link WorkSpec}s referenced
-     * by a given {@link WorkQuery}.
-     *
-     * @param workManager The {@link WorkManagerImpl} to use
-     * @param querySpec   The {@link WorkQuery} to use
-     * @return an instance of {@link StatusRunnable}
-     */
-    @NonNull
-    public static StatusRunnable<List<WorkInfo>> forWorkQuerySpec(
-            @NonNull final WorkManagerImpl workManager,
-            @NonNull final WorkQuery querySpec) {
-
-        return new StatusRunnable<List<WorkInfo>>() {
-            @Override
-            List<WorkInfo> runInternal() {
-                WorkDatabase workDatabase = workManager.getWorkDatabase();
-                List<WorkSpec.WorkInfoPojo> workInfoPojos =
-                        workDatabase.rawWorkInfoDao().getWorkInfoPojos(
-                                RawQueries.toRawQuery(querySpec));
-                return WorkSpec.WORK_INFO_MAPPER.apply(workInfoPojos);
-            }
-        };
-    }
-}
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/StatusRunnable.kt b/work/work-runtime/src/main/java/androidx/work/impl/utils/StatusRunnable.kt
new file mode 100644
index 0000000..75e8411
--- /dev/null
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/StatusRunnable.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@file:JvmName("StatusRunnable")
+
+package androidx.work.impl.utils
+
+import androidx.work.WorkInfo
+import androidx.work.WorkQuery
+import androidx.work.impl.WorkDatabase
+import androidx.work.impl.model.WorkSpec.Companion.WORK_INFO_MAPPER
+import androidx.work.impl.utils.futures.SettableFuture
+import androidx.work.impl.utils.taskexecutor.TaskExecutor
+import com.google.common.util.concurrent.ListenableFuture
+import java.util.UUID
+
+internal fun WorkDatabase.forStringIds(
+    executor: TaskExecutor,
+    ids: List<String>,
+): ListenableFuture<List<WorkInfo>> = loadStatusFuture(executor) { db ->
+    WORK_INFO_MAPPER.apply(db.workSpecDao().getWorkStatusPojoForIds(ids))
+}
+
+internal fun WorkDatabase.forUUID(
+    executor: TaskExecutor,
+    id: UUID,
+): ListenableFuture<WorkInfo?> = loadStatusFuture(executor) { db ->
+    db.workSpecDao().getWorkStatusPojoForId(id.toString())?.toWorkInfo()
+}
+
+internal fun WorkDatabase.forTag(
+    executor: TaskExecutor,
+    tag: String
+): ListenableFuture<List<WorkInfo>> = loadStatusFuture(executor) { db ->
+    WORK_INFO_MAPPER.apply(db.workSpecDao().getWorkStatusPojoForTag(tag))
+}
+
+internal fun WorkDatabase.forUniqueWork(
+    executor: TaskExecutor,
+    name: String,
+): ListenableFuture<List<WorkInfo>> = loadStatusFuture(executor) { db ->
+    WORK_INFO_MAPPER.apply(db.workSpecDao().getWorkStatusPojoForName(name))
+}
+
+internal fun WorkDatabase.forWorkQuerySpec(
+    executor: TaskExecutor,
+    querySpec: WorkQuery
+): ListenableFuture<List<WorkInfo>> = loadStatusFuture(executor) { db ->
+    WORK_INFO_MAPPER.apply(db.rawWorkInfoDao().getWorkInfoPojos(querySpec.toRawQuery()))
+}
+
+// it should be rewritten via SuspendToFutureAdapter.launchFuture once it is stable.
+private fun <T> WorkDatabase.loadStatusFuture(
+    executor: TaskExecutor,
+    block: (WorkDatabase) -> T
+): ListenableFuture<T> = SettableFuture.create<T>().apply {
+    executor.serialTaskExecutor.execute {
+        try {
+            set(block(this@loadStatusFuture))
+        } catch (throwable: Throwable) {
+            setException(throwable)
+        }
+    }
+}
diff --git a/work/work-testing/api/api_lint.ignore b/work/work-testing/api/api_lint.ignore
index d107b77..a4667ce 100644
--- a/work/work-testing/api/api_lint.ignore
+++ b/work/work-testing/api/api_lint.ignore
@@ -17,12 +17,6 @@
     W does not declare a `getWorkerFactory()` method matching method androidx.work.testing.TestListenableWorkerBuilder.setWorkerFactory(androidx.work.WorkerFactory)
 
 
-MissingNullability: androidx.work.testing.TestListenableWorkerBuilderKt#TestListenableWorkerBuilder(android.content.Context, androidx.work.Data, java.util.List<? extends java.lang.String>, int, java.util.List<? extends android.net.Uri>, java.util.List<? extends java.lang.String>):
-    Missing nullability on method `TestListenableWorkerBuilder` return
-MissingNullability: androidx.work.testing.TestWorkerBuilderKt#TestWorkerBuilder(android.content.Context, java.util.concurrent.Executor, androidx.work.Data, java.util.List<? extends java.lang.String>, int, java.util.List<? extends android.net.Uri>, java.util.List<? extends java.lang.String>):
-    Missing nullability on method `TestWorkerBuilder` return
-
-
 StaticFinalBuilder: androidx.work.testing.TestListenableWorkerBuilder:
     Builder must be final: androidx.work.testing.TestListenableWorkerBuilder