Merge "Add a separate internal task executor pool to fix flaky tests." into androidx-master-dev
diff --git a/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityResultFragmentVersionDetector.kt b/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityResultFragmentVersionDetector.kt
index 582084e..99e8848 100644
--- a/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityResultFragmentVersionDetector.kt
+++ b/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityResultFragmentVersionDetector.kt
@@ -60,7 +60,7 @@
         )
     }
 
-    var location: Location? = null
+    var locations = ArrayList<Location>()
     lateinit var expression: UCallExpression
 
     private var checkedImplementationDependencies = false
@@ -76,7 +76,7 @@
                     return
                 }
                 expression = node
-                location = context.getLocation(node)
+                locations.add(context.getLocation(node))
             }
         }
     }
@@ -90,7 +90,7 @@
         valueCookie: Any,
         statementCookie: Any
     ) {
-        if (location == null) {
+        if (locations.isEmpty()) {
             return
         }
         if (property == "api") {
@@ -195,8 +195,10 @@
 
         if (library.isNotEmpty() &&
             library.substringAfter("androidx.fragment:fragment:") < FRAGMENT_VERSION) {
-            context.report(ISSUE, expression, location!!,
-                "Upgrade Fragment version to at least $FRAGMENT_VERSION.")
+            locations.forEach { location ->
+                context.report(ISSUE, expression, location,
+                    "Upgrade Fragment version to at least $FRAGMENT_VERSION.")
+            }
         }
     }
 
diff --git a/activity/activity-lint/src/test/java/androidx/activity/lint/ActivityResultFragmentVersionDetectorTest.kt b/activity/activity-lint/src/test/java/androidx/activity/lint/ActivityResultFragmentVersionDetectorTest.kt
index 5726acc..b47349c 100644
--- a/activity/activity-lint/src/test/java/androidx/activity/lint/ActivityResultFragmentVersionDetectorTest.kt
+++ b/activity/activity-lint/src/test/java/androidx/activity/lint/ActivityResultFragmentVersionDetectorTest.kt
@@ -148,6 +148,47 @@
     }
 
     @Test
+    fun expectFailRegisterForActivityResultMultipleCalls() {
+        lint().files(
+            gradle(
+                """
+                dependencies {
+                    api("androidx.fragment:fragment:1.3.0-alpha05")
+                }
+            """
+            ),
+            kotlin(
+                """
+                package com.example
+
+                import androidx.activity.result.ActivityResultCaller
+                import androidx.activity.result.contract.ActivityResultContract
+
+                val launcher1 = ActivityResultCaller().registerForActivityResult(ActivityResultContract())
+
+                lateinit var launcher2: ActivityResultLauncher
+
+                fun foo() {
+                    launcher2 = ActivityResultCaller().registerForActivityResult(ActivityResultContract())
+                }
+            """
+            ).indented()
+        )
+            .run()
+            .expect(
+                """
+                src/main/kotlin/com/example/test.kt:6: Error: Upgrade Fragment version to at least 1.3.0-alpha08. [InvalidFragmentVersionForActivityResult]
+                val launcher1 = ActivityResultCaller().registerForActivityResult(ActivityResultContract())
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+                src/main/kotlin/com/example/test.kt:11: Error: Upgrade Fragment version to at least 1.3.0-alpha08. [InvalidFragmentVersionForActivityResult]
+                    launcher2 = ActivityResultCaller().registerForActivityResult(ActivityResultContract())
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+                2 errors, 0 warnings
+            """.trimIndent()
+            )
+    }
+
+    @Test
     fun expectFailTransitiveDependency() {
         val projectFragment = project(kotlin(
                 """
diff --git a/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java b/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
index b629dd1..2a2ef45 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
@@ -109,20 +109,25 @@
     private static final boolean DEBUG_FORCE_FINGERPRINT = false;
 
     /**
-     * A handler used to post delayed events and to execute framework code.
-     */
-    @VisibleForTesting Handler mHandler = new Handler(Looper.getMainLooper());
-
-    /**
      * An executor used by {@link android.hardware.biometrics.BiometricPrompt} to run framework
      * code.
      */
-    private final Executor mPromptExecutor = new Executor() {
+    private static class PromptExecutor implements Executor {
+        private final Handler mPromptHandler = new Handler(Looper.getMainLooper());
+
+        @SuppressWarnings("WeakerAccess") /* synthetic access */
+        PromptExecutor() {}
+
         @Override
         public void execute(@NonNull Runnable runnable) {
-            mHandler.post(runnable);
+            mPromptHandler.post(runnable);
         }
-    };
+    }
+
+    /**
+     * A handler used to post delayed events.
+     */
+    @VisibleForTesting Handler mHandler = new Handler(Looper.getMainLooper());
 
     /**
      * The view model for the ongoing authentication session.
@@ -365,9 +370,8 @@
      */
     @RequiresApi(Build.VERSION_CODES.P)
     private void showBiometricPromptForAuthentication() {
-        final Context context = requireContext();
         final android.hardware.biometrics.BiometricPrompt.Builder builder =
-                Api28Impl.createPromptBuilder(context);
+                Api28Impl.createPromptBuilder(requireContext().getApplicationContext());
 
         final CharSequence title = mViewModel.getTitle();
         final CharSequence subtitle = mViewModel.getSubtitle();
@@ -410,20 +414,17 @@
                 Api28Impl.buildPrompt(builder);
         final android.os.CancellationSignal cancellationSignal =
                 mViewModel.getCancellationSignalProvider().getBiometricCancellationSignal();
+        final Executor executor = new PromptExecutor();
         final android.hardware.biometrics.BiometricPrompt.AuthenticationCallback callback =
                 mViewModel.getAuthenticationCallbackProvider().getBiometricCallback();
         BiometricPrompt.CryptoObject crypto = mViewModel.getCryptoObject();
         if (crypto == null) {
-            Api28Impl.authenticate(biometricPrompt, cancellationSignal, mPromptExecutor, callback);
+            Api28Impl.authenticate(biometricPrompt, cancellationSignal, executor, callback);
         } else {
             android.hardware.biometrics.BiometricPrompt.CryptoObject wrappedCrypto =
                     Objects.requireNonNull(CryptoObjectUtils.wrapForBiometricPrompt(crypto));
             Api28Impl.authenticate(
-                    biometricPrompt,
-                    wrappedCrypto,
-                    cancellationSignal,
-                    mPromptExecutor,
-                    callback);
+                    biometricPrompt, wrappedCrypto, cancellationSignal, executor, callback);
         }
     }
 
diff --git a/biometric/biometric/src/main/java/androidx/biometric/BiometricViewModel.java b/biometric/biometric/src/main/java/androidx/biometric/BiometricViewModel.java
index f403a81..1b18262 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/BiometricViewModel.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/BiometricViewModel.java
@@ -27,6 +27,7 @@
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModel;
 
+import java.lang.ref.WeakReference;
 import java.util.concurrent.Executor;
 
 /**
@@ -41,6 +42,103 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 public class BiometricViewModel extends ViewModel {
     /**
+     * The default executor provided when {@link #getClientExecutor()} is called before
+     * {@link #setClientExecutor(Executor)}.
+     */
+    private static class DefaultExecutor implements Executor {
+        private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+        @SuppressWarnings("WeakerAccess") /* synthetic access */
+        DefaultExecutor() {}
+
+        @Override
+        public void execute(Runnable runnable) {
+            mHandler.post(runnable);
+        }
+    }
+
+    /**
+     * The authentication callback listener passed to {@link AuthenticationCallbackProvider} when
+     * {@link #getAuthenticationCallbackProvider()} is called.
+     */
+    private static final class CallbackListener extends AuthenticationCallbackProvider.Listener {
+        private final WeakReference<BiometricViewModel> mViewModelRef;
+
+        /**
+         * Creates a callback listener with a weak reference to the given view model.
+         *
+         * @param viewModel The view model instance to hold a weak reference to.
+         */
+        @SuppressWarnings("WeakerAccess") /* synthetic access */
+        CallbackListener(BiometricViewModel viewModel) {
+            mViewModelRef = new WeakReference<>(viewModel);
+        }
+
+        @Override
+        void onSuccess(@NonNull BiometricPrompt.AuthenticationResult result) {
+            if (mViewModelRef.get() != null && mViewModelRef.get().isAwaitingResult()) {
+                // Try to infer the authentication type if unknown.
+                if (result.getAuthenticationType()
+                        == BiometricPrompt.AUTHENTICATION_RESULT_TYPE_UNKNOWN) {
+                    result = new BiometricPrompt.AuthenticationResult(
+                            result.getCryptoObject(),
+                            mViewModelRef.get().getInferredAuthenticationResultType());
+                }
+
+                mViewModelRef.get().setAuthenticationResult(result);
+            }
+        }
+
+        @Override
+        void onError(int errorCode, @Nullable CharSequence errorMessage) {
+            if (mViewModelRef.get() != null
+                    && !mViewModelRef.get().isConfirmingDeviceCredential()
+                    && mViewModelRef.get().isAwaitingResult()) {
+                mViewModelRef.get().setAuthenticationError(
+                        new BiometricErrorData(errorCode, errorMessage));
+            }
+        }
+
+        @Override
+        void onHelp(@Nullable CharSequence helpMessage) {
+            if (mViewModelRef.get() != null) {
+                mViewModelRef.get().setAuthenticationHelpMessage(helpMessage);
+            }
+        }
+
+        @Override
+        void onFailure() {
+            if (mViewModelRef.get() != null && mViewModelRef.get().isAwaitingResult()) {
+                mViewModelRef.get().setAuthenticationFailurePending(true);
+            }
+        }
+    }
+
+    /**
+     * The dialog listener that is returned by {@link #getNegativeButtonListener()}.
+     */
+    private static class NegativeButtonListener implements DialogInterface.OnClickListener {
+        private final WeakReference<BiometricViewModel> mViewModelRef;
+
+        /**
+         * Creates a negative button listener with a weak reference to the given view model.
+         *
+         * @param viewModel The view model instance to hold a weak reference to.
+         */
+        @SuppressWarnings("WeakerAccess") /* synthetic access */
+        NegativeButtonListener(BiometricViewModel viewModel) {
+            mViewModelRef = new WeakReference<>(viewModel);
+        }
+
+        @Override
+        public void onClick(DialogInterface dialogInterface, int which) {
+            if (mViewModelRef.get() != null) {
+                mViewModelRef.get().setNegativeButtonPressPending(true);
+            }
+        }
+    }
+
+    /**
      * The executor that will run authentication callback methods.
      *
      * <p>If unset, callbacks are invoked on the main thread with {@link Looper#getMainLooper()}.
@@ -159,16 +257,7 @@
 
     @NonNull
     Executor getClientExecutor() {
-        if (mClientExecutor == null) {
-            final Handler handler = new Handler(Looper.getMainLooper());
-            mClientExecutor = new Executor() {
-                @Override
-                public void execute(@NonNull Runnable command) {
-                    handler.post(command);
-                }
-            };
-        }
-        return mClientExecutor;
+        return mClientExecutor != null ? mClientExecutor : new DefaultExecutor();
     }
 
     void setClientExecutor(@NonNull Executor clientExecutor) {
@@ -297,44 +386,8 @@
     @NonNull
     AuthenticationCallbackProvider getAuthenticationCallbackProvider() {
         if (mAuthenticationCallbackProvider == null) {
-            mAuthenticationCallbackProvider = new AuthenticationCallbackProvider(
-                    new AuthenticationCallbackProvider.Listener() {
-                        @Override
-                        void onSuccess(@NonNull BiometricPrompt.AuthenticationResult result) {
-                            if (isAwaitingResult()) {
-                                // Try to infer the authentication type if unknown.
-                                if (result.getAuthenticationType()
-                                        == BiometricPrompt.AUTHENTICATION_RESULT_TYPE_UNKNOWN) {
-                                    result = new BiometricPrompt.AuthenticationResult(
-                                            result.getCryptoObject(),
-                                            getInferredAuthenticationResultType());
-                                }
-
-                                setAuthenticationResult(result);
-                            }
-                        }
-
-                        @Override
-                        void onError(int errorCode, @Nullable CharSequence errorMessage) {
-                            if (!isConfirmingDeviceCredential() && isAwaitingResult()) {
-                                setAuthenticationError(
-                                        new BiometricErrorData(errorCode, errorMessage));
-                            }
-                        }
-
-                        @Override
-                        void onHelp(@Nullable CharSequence helpMessage) {
-                            setAuthenticationHelpMessage(helpMessage);
-                        }
-
-                        @Override
-                        void onFailure() {
-                            if (isAwaitingResult()) {
-                                setAuthenticationFailurePending(true);
-                            }
-                        }
-                    }
-            );
+            mAuthenticationCallbackProvider =
+                    new AuthenticationCallbackProvider(new CallbackListener(this));
         }
         return mAuthenticationCallbackProvider;
     }
@@ -350,12 +403,7 @@
     @NonNull
     DialogInterface.OnClickListener getNegativeButtonListener() {
         if (mNegativeButtonListener == null) {
-            mNegativeButtonListener = new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialog, int which) {
-                    setNegativeButtonPressPending(true);
-                }
-            };
+            mNegativeButtonListener = new NegativeButtonListener(this);
         }
         return mNegativeButtonListener;
     }
@@ -540,20 +588,6 @@
     }
 
     /**
-     * Ensures the value of a given mutable live data object is updated on the main thread.
-     *
-     * @param liveData The mutable live data object whose value should be updated.
-     * @param value    The new value to be set for the mutable live data object.
-     */
-    private static <T> void updateValue(MutableLiveData<T> liveData, T value) {
-        if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
-            liveData.setValue(value);
-        } else {
-            liveData.postValue(value);
-        }
-    }
-
-    /**
      * Attempts to infer the type of authenticator that was used to authenticate the user.
      *
      * @return The inferred authentication type, or
@@ -569,4 +603,18 @@
         }
         return BiometricPrompt.AUTHENTICATION_RESULT_TYPE_UNKNOWN;
     }
+
+    /**
+     * Ensures the value of a given mutable live data object is updated on the main thread.
+     *
+     * @param liveData The mutable live data object whose value should be updated.
+     * @param value    The new value to be set for the mutable live data object.
+     */
+    private static <T> void updateValue(MutableLiveData<T> liveData, T value) {
+        if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
+            liveData.setValue(value);
+        } else {
+            liveData.postValue(value);
+        }
+    }
 }
diff --git a/biometric/integration-tests/testapp/build.gradle b/biometric/integration-tests/testapp/build.gradle
index e1e27e0..73b5721 100644
--- a/biometric/integration-tests/testapp/build.gradle
+++ b/biometric/integration-tests/testapp/build.gradle
@@ -28,22 +28,25 @@
         applicationId "androidx.biometric.integration.testapp"
         minSdkVersion 18
         versionCode 1
+        testInstrumentationRunnerArgument "listener", "leakcanary.FailTestOnLeakRunListener"
     }
 
     sourceSets {
         main.manifest.srcFile 'src/main/AndroidManifest.xml'
         main.java.srcDirs = ['src/main/java']
-        main.java.excludes = ['**/build/**']
         main.java.includes = ['**/*.java']
+        main.java.excludes = ['**/build/**']
         main.res.srcDirs = ['src/main/res']
     }
 
     buildTypes {
         debug {
-            testCoverageEnabled true
+            testCoverageEnabled false
         }
 
         release {
+            minifyEnabled true
+            shrinkResources true
         }
     }
 }
@@ -52,6 +55,20 @@
     implementation(project(":biometric:biometric"))
     implementation("androidx.activity:activity-ktx:1.1.0")
     implementation("androidx.core:core:1.2.0")
-    implementation("androidx.fragment:fragment:1.2.5")
+    implementation("androidx.fragment:fragment-ktx:1.2.5")
     implementation(KOTLIN_STDLIB)
+
+    debugImplementation(LEAKCANARY)
+
+    androidTestImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
+    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(ESPRESSO_IDLING_RESOURCE)
+    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(LEAKCANARY)
+    androidTestImplementation(LEAKCANARY_INSTRUMENTATION)
+    androidTestImplementation(TRUTH)
 }
diff --git a/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/BiometricPromptEnrolledTest.kt b/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/BiometricPromptEnrolledTest.kt
new file mode 100644
index 0000000..d41e7a1
--- /dev/null
+++ b/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/BiometricPromptEnrolledTest.kt
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.biometric.integration.testapp
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import org.hamcrest.Matchers.containsString
+import org.junit.After
+import org.junit.Assume.assumeFalse
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class BiometricPromptEnrolledTest {
+    @Suppress("DEPRECATION")
+    @get:Rule
+    val activityRule = androidx.test.rule.ActivityTestRule(BiometricTestActivity::class.java)
+
+    private lateinit var context: Context
+    private lateinit var device: UiDevice
+
+    @Before
+    fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        assumeTrue(TestUtils.hasEnrolledBiometric(context))
+        assumeFalse(TestUtils.isDeviceLocked(context))
+        device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+    }
+
+    @After
+    fun tearDown() {
+        if (::device.isInitialized) {
+            TestUtils.changeOrientation(device, landscape = false)
+            device.pressHome()
+        }
+    }
+
+    @Test
+    fun testBiometricOnlyAuth_SendsError_WhenBackPressed() {
+        onView(withId(R.id.button_authenticate)).perform(click())
+        device.pressBack()
+        onView(withId(R.id.text_view_log)).check(
+            matches(withText(containsString("onAuthenticationError")))
+        )
+    }
+
+    @Test
+    fun testBiometricOnlyAuth_SendsError_WhenBackPressedAfterRotation() {
+        onView(withId(R.id.button_authenticate)).perform(click())
+        TestUtils.changeOrientation(device, landscape = true)
+        device.pressBack()
+        onView(withId(R.id.text_view_log)).check(
+            matches(withText(containsString("onAuthenticationError")))
+        )
+    }
+
+    @Test
+    fun testBiometricOnlyAuth_SendsError_WhenBackPressedAfterRepeatedRotation() {
+        onView(withId(R.id.button_authenticate)).perform(click())
+        for (i in 1..3) {
+            TestUtils.changeOrientation(device, landscape = true)
+            TestUtils.changeOrientation(device, landscape = false)
+        }
+        device.pressBack()
+        onView(withId(R.id.text_view_log)).check(
+            matches(withText(containsString("onAuthenticationError")))
+        )
+    }
+
+    @Test
+    fun testBiometricOrCredentialAuth_SendsError_WhenBackPressed() {
+        onView(withId(R.id.checkbox_allow_device_credential)).perform(click())
+        onView(withId(R.id.button_authenticate)).perform(click())
+        device.pressBack()
+        onView(withId(R.id.text_view_log)).check(
+            matches(withText(containsString("onAuthenticationError")))
+        )
+    }
+
+    @Test
+    fun testBiometricOrCredentialAuth_SendsError_WhenBackPressedAfterRotation() {
+        onView(withId(R.id.checkbox_allow_device_credential)).perform(click())
+        onView(withId(R.id.button_authenticate)).perform(click())
+        TestUtils.changeOrientation(device, landscape = true)
+        device.pressBack()
+        onView(withId(R.id.text_view_log)).check(
+            matches(withText(containsString("onAuthenticationError")))
+        )
+    }
+
+    @Test
+    fun testBiometricOrCredentialAuth_SendsError_WhenBackPressedAfterRepeatedRotation() {
+        onView(withId(R.id.checkbox_allow_device_credential)).perform(click())
+        onView(withId(R.id.button_authenticate)).perform(click())
+        for (i in 1..3) {
+            TestUtils.changeOrientation(device, landscape = true)
+            TestUtils.changeOrientation(device, landscape = false)
+        }
+        device.pressBack()
+        onView(withId(R.id.text_view_log)).check(
+            matches(withText(containsString("onAuthenticationError")))
+        )
+    }
+
+    @Test
+    fun testCancelOnConfigurationChange_SendsError_WhenDeviceRotates() {
+        onView(withId(R.id.checkbox_cancel_config_change)).perform(click())
+        onView(withId(R.id.button_authenticate)).perform(click())
+        TestUtils.changeOrientation(device, landscape = true)
+        onView(withId(R.id.text_view_log)).check(
+            matches(withText(containsString("onAuthenticationError")))
+        )
+    }
+}
\ No newline at end of file
diff --git a/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/TestUtils.kt b/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/TestUtils.kt
new file mode 100644
index 0000000..3dedd5f
--- /dev/null
+++ b/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/TestUtils.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.biometric.integration.testapp
+
+import android.app.Instrumentation
+import android.app.KeyguardManager
+import android.content.Context
+import android.os.Build
+import androidx.biometric.BiometricManager
+import androidx.biometric.BiometricManager.Authenticators
+import androidx.biometric.BiometricManager.BIOMETRIC_SUCCESS
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+
+/**
+ * A collection of testing utilities for the biometric integration test app.
+ */
+internal object TestUtils {
+    /**
+     * The maximum time that [changeOrientation] should wait for the device to finish rotating.
+     */
+    private const val ROTATE_TIMEOUT_MS = 2000L
+
+    /**
+     * Changes the [device] to [landscape] or portrait orientation and waits for rotation to finish.
+     */
+    internal fun changeOrientation(device: UiDevice, landscape: Boolean) {
+        // Create a monitor to wait for the activity to be recreated.
+        val monitor = Instrumentation.ActivityMonitor(
+            BiometricTestActivity::class.java.name,
+            null /* result */,
+            false /* block */
+        )
+        InstrumentationRegistry.getInstrumentation().addMonitor(monitor)
+
+        if (landscape) {
+            device.setOrientationLeft()
+        } else {
+            device.setOrientationNatural()
+        }
+
+        // Wait for the rotation to complete.
+        InstrumentationRegistry.getInstrumentation().waitForMonitorWithTimeout(
+            monitor,
+            ROTATE_TIMEOUT_MS
+        )
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+    }
+
+    /**
+     * Checks [context] to determine if the device has an enrolled biometric authentication method.
+     */
+    internal fun hasEnrolledBiometric(context: Context): Boolean {
+        val biometricManager = BiometricManager.from(context)
+        return biometricManager.canAuthenticate(Authenticators.BIOMETRIC_WEAK) == BIOMETRIC_SUCCESS
+    }
+
+    /**
+     * Checks [context] to determine if the device is currently locked.
+     */
+    internal fun isDeviceLocked(context: Context): Boolean {
+        val keyguard = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
+            context.getSystemService(KeyguardManager::class.java)
+        else
+            context.getSystemService(Context::KEYGUARD_SERVICE.toString()) as KeyguardManager?
+
+        return when {
+            keyguard == null -> false
+            Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 -> keyguard.isDeviceLocked
+            else -> keyguard.isKeyguardLocked
+        }
+    }
+}
\ No newline at end of file
diff --git a/biometric/integration-tests/testapp/src/main/java/androidx/biometric/integration/testapp/BiometricTestActivity.kt b/biometric/integration-tests/testapp/src/main/java/androidx/biometric/integration/testapp/BiometricTestActivity.kt
index 84155bc..069fefc 100644
--- a/biometric/integration-tests/testapp/src/main/java/androidx/biometric/integration/testapp/BiometricTestActivity.kt
+++ b/biometric/integration-tests/testapp/src/main/java/androidx/biometric/integration/testapp/BiometricTestActivity.kt
@@ -253,6 +253,7 @@
         private const val KEY_LOG_TEXT = "key_log_text"
         private const val KEY_NAME = "mySecretKey"
         private const val KEYSTORE_INSTANCE = "AndroidKeyStore"
+        private const val LATCH_AWAIT_TIMEOUT_SEC = 10L
         private const val PAYLOAD = "hello"
 
         /**
diff --git a/biometric/integration-tests/testapp/src/main/res/layout/activity_biometric_test.xml b/biometric/integration-tests/testapp/src/main/res/layout/activity_biometric_test.xml
index b4bdefb..cd8de8f 100644
--- a/biometric/integration-tests/testapp/src/main/res/layout/activity_biometric_test.xml
+++ b/biometric/integration-tests/testapp/src/main/res/layout/activity_biometric_test.xml
@@ -15,142 +15,142 @@
   limitations under the License.
   -->
 
-<LinearLayout
+<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingHorizontal="8dp"
-    android:paddingVertical="4dp"
-    android:orientation="vertical">
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Authenticator types:"
-        android:textColor="?android:textColorPrimary" />
-
+    android:layout_height="match_parent">
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="horizontal">
-        <CheckBox
-            android:id="@+id/checkbox_allow_biometric_strong"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" />
+        android:paddingHorizontal="8dp"
+        android:paddingVertical="4dp"
+        android:orientation="vertical">
+
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="BIOMETRIC_STRONG"
+            android:text="Authenticator types:"
             android:textColor="?android:textColorPrimary" />
-    </LinearLayout>
 
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
-        <CheckBox
-            android:id="@+id/checkbox_allow_biometric_weak"
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:checked="true" />
+            android:orientation="horizontal">
+            <CheckBox
+                android:id="@+id/checkbox_allow_biometric_strong"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content" />
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="BIOMETRIC_STRONG"
+                android:textColor="?android:textColorPrimary" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+            <CheckBox
+                android:id="@+id/checkbox_allow_biometric_weak"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:checked="true" />
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="BIOMETRIC_WEAK"
+                android:textColor="?android:textColorPrimary" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+            <CheckBox
+                android:id="@+id/checkbox_allow_device_credential"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content" />
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="DEVICE_CREDENTIAL"
+                android:textColor="?android:textColorPrimary" />
+        </LinearLayout>
+
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="BIOMETRIC_WEAK"
+            android:text="Other options:"
             android:textColor="?android:textColorPrimary" />
-    </LinearLayout>
 
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
-        <CheckBox
-            android:id="@+id/checkbox_allow_device_credential"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" />
-        <TextView
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="DEVICE_CREDENTIAL"
-            android:textColor="?android:textColorPrimary" />
-    </LinearLayout>
+            android:orientation="horizontal">
+            <CheckBox
+                android:id="@+id/checkbox_cancel_config_change"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content" />
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Cancel on configuration change"
+                android:textColor="?android:textColorPrimary" />
+        </LinearLayout>
 
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Other options:"
-        android:textColor="?android:textColorPrimary" />
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
-        <CheckBox
-            android:id="@+id/checkbox_cancel_config_change"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" />
-        <TextView
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="Cancel on configuration change"
-            android:textColor="?android:textColorPrimary" />
-    </LinearLayout>
+            android:orientation="horizontal">
+            <CheckBox
+                android:id="@+id/checkbox_require_confirmation"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:checked="true" />
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Require confirmation"
+                android:textColor="?android:textColorPrimary" />
+        </LinearLayout>
 
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
-        <CheckBox
-            android:id="@+id/checkbox_require_confirmation"
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:checked="true" />
-        <TextView
-            android:layout_width="wrap_content"
+            android:orientation="horizontal">
+            <CheckBox
+                android:id="@+id/checkbox_use_crypto_auth"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content" />
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Use crypto-based authentication"
+                android:textColor="?android:textColorPrimary" />
+        </LinearLayout>
+
+        <Button
+            android:id="@+id/button_can_authenticate"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="Require confirmation"
-            android:textColor="?android:textColorPrimary" />
-    </LinearLayout>
+            android:text="Can authenticate" />
 
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
-        <CheckBox
-            android:id="@+id/checkbox_use_crypto_auth"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" />
-        <TextView
-            android:layout_width="wrap_content"
+        <Button
+            android:id="@+id/button_authenticate"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="Use crypto-based authentication"
-            android:textColor="?android:textColorPrimary" />
-    </LinearLayout>
+            android:text="Authenticate" />
 
-    <Button
-        android:id="@+id/button_can_authenticate"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Can authenticate" />
+        <Button
+            android:id="@+id/button_clear_log"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Clear log" />
 
-    <Button
-        android:id="@+id/button_authenticate"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Authenticate" />
-
-    <Button
-        android:id="@+id/button_clear_log"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="Clear log" />
-
-    <ScrollView
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
         <TextView
             android:id="@+id/text_view_log"
             android:layout_width="match_parent"
             android:layout_height="wrap_content" />
-    </ScrollView>
-</LinearLayout>
\ No newline at end of file
+    </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
index dade6b5..fa533f7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
@@ -461,7 +461,9 @@
             ),
             setOf(
                 ":support-media2-test-client",
-                ":support-media2-test-service"
+                ":support-media2-test-service",
+                ":support-media2-test-client-previous",
+                ":support-media2-test-service-previous"
             ), // Link graphics and material to always run @Large in presubmit per b/160624022
             setOf(
                 ":compose:ui:ui-graphics",
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
index 084e74a..19909dc 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
@@ -40,7 +40,7 @@
 
             @Composable
             fun App() {
-                val cond = state { true }
+                val cond = remember { mutableStateOf(true) }
                 val text = if (cond.value) remember { "abc" } else remember { "def" }
                 Button(id=1, text=text, onClick={ cond.value = !cond.value })
             }
@@ -568,7 +568,7 @@
                     children()
                 }
             """,
-            "SimpleComposable(state=state { 0 })"
+            "SimpleComposable(state=remember { mutableStateOf(0) })"
         ).then { activity ->
             val button = activity.findViewById(42) as Button
             button.performClick()
@@ -592,7 +592,7 @@
                 )
             }
         """,
-            "SimpleComposable(state=state { 0 }, value=\"Value\")"
+            "SimpleComposable(state=remember { mutableStateOf(0) }, value=\"Value\")"
         ).then { activity ->
             val button = activity.findViewById(42) as Button
             button.performClick()
@@ -1062,7 +1062,7 @@
             @Composable
             fun SimpleComposable() {
                 a++
-                val c = state { 0 }
+                val c = remember { mutableStateOf(0) }
                 val d = remember(c.value) { b++; b }
                 val recompose = invalidate
                 Button(
@@ -1315,7 +1315,7 @@
 
             @Composable
             fun Main() {
-                var text = state { "$initialText" }
+                var text = remember { mutableStateOf("$initialText") }
                 Providers(TextAmbient provides text.value) {
                     LinearLayout {
                         ConsumesAmbientFromDefaultParameter()
@@ -1787,7 +1787,7 @@
 
                 @Composable
                 fun Counter() {
-                    var count = state { 0 }
+                    var count = remember { mutableStateOf(0) }
                     TextView(
                         text=("Count: " + count.value),
                         onClick={
@@ -1819,7 +1819,7 @@
 
                 @Composable
                 fun Counter() {
-                    var count = state { 0 }
+                    var count = remember { mutableStateOf(0) }
                     TextView(
                         text=("Count: " + count.value),
                         onClick={
@@ -1852,7 +1852,7 @@
 
                 @Composable
                 fun Counter(log: StringBuilder) {
-                    var count = state { 0 }
+                    var count = remember { mutableStateOf(0) }
                     onCommit {
                         log.append("a")
                     }
@@ -1902,7 +1902,7 @@
 
                 @Composable
                 fun Counter(log: StringBuilder) {
-                    var count = state { 0 }
+                    var count = remember { mutableStateOf(0) }
                     printer(log, "" + count.value)
                     TextView(
                         text=("Count: " + count.value),
@@ -2060,7 +2060,7 @@
 
             @Composable
             fun Reordering() {
-                val items = state { listOf(1, 2, 3, 4, 5) }
+                val items = remember { mutableStateOf(listOf(1, 2, 3, 4, 5)) }
 
                 LinearLayout(orientation=LinearLayout.VERTICAL) {
                     items.value.forEachIndexed { index, id ->
@@ -2081,7 +2081,7 @@
 
             @Composable
             private fun Item(id: Int, onMove: (Int) -> Unit) {
-                val count = state { 0 }
+                val count = remember { mutableStateOf(0) }
                 LinearLayout(orientation=LinearLayout.HORIZONTAL) {
                     TextView(id=(id+$tvId), text="id: ${'$'}id amt: ${'$'}{count.value}")
                     Button(id=(id+$btnIdAdd), text="+", onClick={ count.value++ })
@@ -2129,7 +2129,7 @@
             """
                 @Composable
                 fun SimpleComposable() {
-                    val count = state { 1 }
+                    val count = remember { mutableStateOf(1) }
                     Box {
                         repeat(count.value) {
                             Button(text="Increment", onClick={ count.value += 1 }, id=(41+it))
@@ -2185,7 +2185,7 @@
 
             @Composable
             private fun StatefulButton() {
-                val count = state { 0 }
+                val count = remember { mutableStateOf(0) }
                 Button(text="Clicked ${'$'}{count.value} times!", onClick={ count.value++ })
             }
             """,
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
index e33e5ae..1f1024a 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
@@ -2228,11 +2228,12 @@
     @Test
     fun testApplyOnComposableCallResult(): Unit = controlFlow(
         """
-            import androidx.compose.runtime.state
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
             import androidx.compose.runtime.State
 
             @Composable
-            fun <T> provided(value: T): State<T> = state { value }.apply {
+            fun <T> provided(value: T): State<T> = remember { mutableStateOf(value) }.apply {
                 this.value = value
             }
         """,
@@ -2240,10 +2241,12 @@
             @Composable
             fun <T> provided(value: T, %composer: Composer<*>?, %key: Int, %changed: Int): State<T> {
               %composer.startReplaceableGroup(<> xor %key, "C(provided):Test.kt")
-              val tmp0 = state(null, {
-                val tmp0_return = value
+              val tmp0 = remember({
+                val tmp0_return = mutableStateOf(
+                  value = value
+                )
                 tmp0_return
-              }, %composer, <>, 0, 0b0001).apply {
+              }, %composer, <>, 0).apply {
                 value = value
               }
               %composer.endReplaceableGroup()
@@ -2255,7 +2258,8 @@
     @Test
     fun testReturnInlinedExpressionWithCall(): Unit = controlFlow(
         """
-            import androidx.compose.runtime.state
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
             import androidx.compose.runtime.State
 
             @Composable
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
index a314bb4..6970235 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
@@ -699,7 +699,7 @@
 
         @Composable
         fun Example(model: String) {
-          val s = state { model }
+          val s = remember { mutableStateOf(model) }
           s.value = model
           Test1({ s.value })
         }
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
index 9958421..093f3b2 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
@@ -16,8 +16,10 @@
 
 package androidx.compose.compiler.plugins.kotlin
 
+import org.junit.Ignore
 import org.junit.Test
 
+@Ignore("Pending fix for b/162464429")
 class RememberIntrinsicTransformTests : ComposeIrTransformTest() {
     private fun comparisonPropagation(
         unchecked: String,
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
index 84e5b9b..a14e897 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
@@ -1,11 +1,11 @@
 package androidx.compose.compiler.plugins.kotlin.analysis
 
-import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
-import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
-import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
 import androidx.compose.compiler.plugins.kotlin.AbstractComposeDiagnosticsTest
 import androidx.compose.compiler.plugins.kotlin.newConfiguration
 import com.intellij.openapi.util.Disposer
+import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
+import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
+import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
 
 class ComposableCheckerTests : AbstractComposeDiagnosticsTest() {
     override fun setUp() {
@@ -879,13 +879,13 @@
             @Composable fun Foo() {}
 
             val <!COMPOSABLE_EXPECTED!>y<!>: Any get() =
-            <!COMPOSABLE_INVOCATION!>state<!> { 1 }
+            <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(1) }
 
             fun App() {
                 val x = object {
                   val <!COMPOSABLE_EXPECTED!>a<!> get() =
-                  <!COMPOSABLE_INVOCATION!>state<!> { 2 }
-                  @Composable val c get() = state { 4 }
+                  <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(2) }
+                  @Composable val c get() = remember { mutableStateOf(4) }
                   @Composable fun bar() { Foo() }
                   fun <!COMPOSABLE_EXPECTED!>foo<!>() {
                     <!COMPOSABLE_INVOCATION!>Foo<!>()
@@ -893,8 +893,8 @@
                 }
                 class Bar {
                   val <!COMPOSABLE_EXPECTED!>b<!> get() =
-                  <!COMPOSABLE_INVOCATION!>state<!> { 6 }
-                  @Composable val c get() = state { 7 }
+                  <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(6) }
+                  @Composable val c get() = remember { mutableStateOf(7) }
                 }
                 fun <!COMPOSABLE_EXPECTED!>Bam<!>() {
                     <!COMPOSABLE_INVOCATION!>Foo<!>()
@@ -915,16 +915,16 @@
 
             @Composable fun App() {
                 val x = object {
-                  val <!COMPOSABLE_EXPECTED!>a<!> get() = <!COMPOSABLE_INVOCATION!>state<!> { 2 }
-                  @Composable val c get() = state { 4 }
+                  val <!COMPOSABLE_EXPECTED!>a<!> get() = <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(2) }
+                  @Composable val c get() = remember { mutableStateOf(4) }
                   fun <!COMPOSABLE_EXPECTED!>foo<!>() {
                     <!COMPOSABLE_INVOCATION!>Foo<!>()
                   }
                   @Composable fun bar() { Foo() }
                 }
                 class Bar {
-                  val <!COMPOSABLE_EXPECTED!>b<!> get() = <!COMPOSABLE_INVOCATION!>state<!> { 6 }
-                  @Composable val c get() = state { 7 }
+                  val <!COMPOSABLE_EXPECTED!>b<!> get() = <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(6) }
+                  @Composable val c get() = remember { mutableStateOf(7) }
                 }
                 fun <!COMPOSABLE_EXPECTED!>Bam<!>() {
                     <!COMPOSABLE_INVOCATION!>Foo<!>()
@@ -943,10 +943,10 @@
 
             @Composable fun App() {
                 val x = object {
-                  val b = state { 3 }
+                  val b = remember { mutableStateOf(3) }
                 }
                 class Bar {
-                  val a = <!COMPOSABLE_INVOCATION!>state<!> { 5 }
+                  val a = <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(5) }
                 }
                 print(x)
             }
diff --git a/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
index ee3a599..5f3ccaf 100644
--- a/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
+++ b/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -2433,7 +2433,8 @@
 
     private fun visitComposableCall(expression: IrCall): IrExpression {
         return when (expression.symbol.descriptor.fqNameSafe) {
-            ComposeFqNames.remember -> visitRememberCall(expression)
+            // TODO: re-enable this once b/162464429 is addressed
+            // ComposeFqNames.remember -> visitRememberCall(expression)
             ComposeFqNames.key -> visitKeyCall(expression)
             else -> visitNormalComposableCall(expression)
         }
diff --git a/compose/compose-runtime/api/current.txt b/compose/compose-runtime/api/current.txt
index c09afc7..4af1087 100644
--- a/compose/compose-runtime/api/current.txt
+++ b/compose/compose-runtime/api/current.txt
@@ -283,8 +283,8 @@
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
     method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
-    method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
-    method @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
     method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
     method @androidx.compose.runtime.Composable public static inline <T, reified V1, reified V2> androidx.compose.runtime.MutableState<T>! stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
diff --git a/compose/compose-runtime/api/public_plus_experimental_current.txt b/compose/compose-runtime/api/public_plus_experimental_current.txt
index c09afc7..4af1087 100644
--- a/compose/compose-runtime/api/public_plus_experimental_current.txt
+++ b/compose/compose-runtime/api/public_plus_experimental_current.txt
@@ -283,8 +283,8 @@
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
     method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
-    method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
-    method @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
     method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
     method @androidx.compose.runtime.Composable public static inline <T, reified V1, reified V2> androidx.compose.runtime.MutableState<T>! stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
diff --git a/compose/compose-runtime/api/restricted_current.txt b/compose/compose-runtime/api/restricted_current.txt
index 5cb67aa..6feabb4 100644
--- a/compose/compose-runtime/api/restricted_current.txt
+++ b/compose/compose-runtime/api/restricted_current.txt
@@ -303,8 +303,8 @@
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
     method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
-    method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
-    method @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
     method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
     method @androidx.compose.runtime.Composable public static inline <T, reified V1, reified V2> androidx.compose.runtime.MutableState<T>! stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
     method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
index 88548d3..8eed09e 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
@@ -25,8 +25,9 @@
 import androidx.compose.runtime.compositionFor
 import androidx.compose.runtime.emit
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 
 @Suppress("unused")
 @OptIn(ExperimentalComposeApi::class)
@@ -86,7 +87,7 @@
     // and then a sample tree could be composed:
     fun runApp(root: GroupNode) {
         root.setContent {
-            var count by state { 0 }
+            var count by remember { mutableStateOf(0) }
             Group {
                 Text("Count: $count")
                 Text("Increment") { count++ }
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
index b588be7..35f1b29 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
@@ -17,17 +17,17 @@
 package androidx.compose.runtime.samples
 
 import androidx.annotation.Sampled
+import androidx.compose.foundation.Text
+import androidx.compose.foundation.layout.Row
+import androidx.compose.material.Button
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.key
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.onCommit
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.runtime.stateFor
-import androidx.compose.foundation.Text
-import androidx.compose.foundation.layout.Row
-import androidx.compose.material.Button
 
 @Suppress("unused")
 @Sampled
@@ -35,7 +35,7 @@
 fun observeUserSample() {
     @Composable
     fun observeUser(userId: Int): User? {
-        val user = stateFor<User?>(userId) { null }
+        val user = remember(userId) { mutableStateOf<User?>(null) }
         onCommit(userId) {
             val subscription = UserAPI.subscribeToUser(userId) {
                 user.value = it
@@ -52,7 +52,7 @@
 @Composable
 fun twoInputsKeySample() {
     for (element in elements) {
-        val selected by key(element.id, parentId) { state { false } }
+        val selected by key(element.id, parentId) { remember { mutableStateOf(false) } }
         ListItem(item = element, selected = selected)
     }
 }
@@ -60,7 +60,7 @@
 @Sampled
 @Composable
 fun SimpleStateSample() {
-    val count = state { 0 }
+    val count = remember { mutableStateOf(0) }
 
     Text(text = "You clicked ${count.value} times")
     Button(onClick = { count.value++ }) {
@@ -71,7 +71,7 @@
 @Sampled
 @Composable
 fun DestructuredStateSample() {
-    val (count, setCount) = state { 0 }
+    val (count, setCount) = remember { mutableStateOf(0) }
 
     Text(text = "You clicked $count times")
     Button(onClick = { setCount(count + 1) }) {
@@ -101,7 +101,7 @@
 @Sampled
 @Composable
 fun DelegatedStateSample() {
-    var count by state { 0 }
+    var count by remember { mutableStateOf(0) }
 
     Text(text = "You clicked $count times")
     Button(onClick = { count = count + 1 }) {
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
index a7919a7..b3ec59c 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
@@ -17,15 +17,16 @@
 package androidx.compose.runtime.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
 import androidx.compose.foundation.BaseTextField
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.Text
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.material.Button
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.text.input.TextFieldValue
 
 @Composable
 @OptIn(ExperimentalFoundationApi::class)
@@ -33,8 +34,8 @@
 fun stateSample() {
     @Composable
     fun LoginScreen() {
-        var username by state { TextFieldValue("user") }
-        var password by state { TextFieldValue("pass") }
+        var username by remember { mutableStateOf(TextFieldValue("user")) }
+        var password by remember { mutableStateOf(TextFieldValue("pass")) }
 
         fun login() = Api.login(username.text, password.text)
 
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
index 93bd48e..2160a32 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
@@ -17,18 +17,19 @@
 package androidx.compose.runtime.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
 import androidx.compose.foundation.BaseTextField
 import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.mutableStateListOf
-import androidx.compose.runtime.state
 import androidx.compose.foundation.Text
-import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.material.Button
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.text.input.TextFieldValue
 
 @Composable
 @OptIn(ExperimentalFoundationApi::class)
@@ -36,7 +37,7 @@
 fun stateListSample() {
     @Composable
     fun Names() {
-        var name by state { TextFieldValue("user") }
+        var name by remember { mutableStateOf(TextFieldValue("user")) }
         val names = mutableStateListOf<String>()
 
         Column {
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
index 4fdf50f..be6136f 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
@@ -17,18 +17,19 @@
 package androidx.compose.runtime.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
 import androidx.compose.foundation.BaseTextField
 import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.mutableStateMapOf
-import androidx.compose.runtime.state
 import androidx.compose.foundation.Text
-import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.material.Button
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateMapOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.text.input.TextFieldValue
 
 @Composable
 @OptIn(ExperimentalFoundationApi::class)
@@ -36,8 +37,8 @@
 fun stateMapSample() {
     @Composable
     fun NamesAndAges() {
-        var name by state { TextFieldValue("name") }
-        var saying by state { TextFieldValue("saying") }
+        var name by remember { mutableStateOf(TextFieldValue("name")) }
+        var saying by remember { mutableStateOf(TextFieldValue("saying")) }
         val sayings = mutableStateMapOf(
             "Caesar" to "Et tu, Brute?",
             "Hamlet" to "To be or not to be",
diff --git a/compose/compose-runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt b/compose/compose-runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
index 8d1aaf2..78f96f3 100644
--- a/compose/compose-runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
+++ b/compose/compose-runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
@@ -100,7 +100,7 @@
         var local = mutableStateOf("invalid")
 
         compose {
-            local = state { "Hello world! ${inc++}" }
+            local = remember { mutableStateOf("Hello world! ${inc++}") } // NOTYPO
             TextView(id = tv1Id, text = local.value)
         }.then { activity ->
             val helloText = activity.findViewById(tv1Id) as TextView
@@ -127,8 +127,8 @@
         var local2 = mutableStateOf("invalid")
 
         compose {
-            local1 = state { "First" }
-            local2 = state { "Second" }
+            local1 = remember { mutableStateOf("First") }
+            local2 = remember { mutableStateOf("Second") }
             TextView(id = tv1Id, text = local1.value)
             TextView(id = tv2Id, text = local2.value)
         }.then { activity ->
@@ -491,7 +491,7 @@
 
         @Composable
         fun UpdateStateInPreCommit() {
-            var value by state { 1 }
+            var value by remember { mutableStateOf(1) }
             readValue = value
             onPreCommit {
                 value = 2
@@ -730,7 +730,7 @@
         var inc = 0
 
         compose {
-            val local = state { "Hello world! ${inc++}" }
+            val local = remember { mutableStateOf("Hello world! ${inc++}") } // NOTYPO
             TextView(id = tv1Id, text = local.value)
         }.then { activity ->
             val helloText = activity.findViewById(tv1Id) as TextView
diff --git a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt
index dd6cf76..eaa45d6 100644
--- a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt
+++ b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt
@@ -109,7 +109,7 @@
 ) : ProvidableAmbient<T>(defaultFactory) {
 
     @Composable
-    override fun provided(value: T): State<T> = state(policy) { value }.apply {
+    override fun provided(value: T): State<T> = remember { mutableStateOf(value, policy) }.apply {
         this.value = value
     }
 }
diff --git a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt
index 501beaf..147103a 100644
--- a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt
+++ b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt
@@ -55,7 +55,7 @@
     initial: R,
     context: CoroutineContext = EmptyCoroutineContext
 ): State<R> {
-    val state = state { initial }
+    val state = remember { mutableStateOf(initial) }
     launchInComposition(this, context) {
         if (context == EmptyCoroutineContext) {
             collect {
diff --git a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
index 8d2ef55..91dd85d 100644
--- a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
+++ b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
@@ -64,6 +64,10 @@
  * @see [remember]
  * @see [SnapshotMutationPolicy]
  */
+@Deprecated(
+    "Replace with explicit use of remember {}",
+    ReplaceWith("remember { mutableStateOf(init(), policy) }")
+)
 @Composable
 inline fun <T> state(
     policy: SnapshotMutationPolicy<T> = structuralEqualityPolicy(),
@@ -91,6 +95,10 @@
  * @see [state]
  * @see [remember]
  */
+@Deprecated(
+    "Replace with explicit use of remember {}",
+    ReplaceWith("remember(v1) { mutableStateOf(init()) }")
+)
 @Composable
 inline fun <T, /*reified*/ V1> stateFor(
     v1: V1,
@@ -342,7 +350,7 @@
      * The componentN() operators allow state objects to be used with the property destructuring
      * syntax
      *
-     * var (foo, setFoo) = state { 0 }
+     * var (foo, setFoo) = remember { mutableStateOf(0) }
      * setFoo(123) // set
      * foo == 123 // get
      */
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
index 8a81ec7..8ed4db9 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
@@ -49,7 +49,6 @@
 
     private static final String SELECTION_ID = "test-selection";
 
-    private List<String> mItems;
     private Set<String> mIgnored;
     private TestAdapter<String> mAdapter;
     private SelectionPredicate<String> mSelectionPredicate;
@@ -61,10 +60,8 @@
     @Before
     public void setUp() throws Exception {
         mIgnored = new HashSet<>();
-        mItems = TestAdapter.createItemList(100);
+        mAdapter = TestAdapter.createStringAdapter(100);
         mListener = new TestSelectionObserver<>();
-        mAdapter = new TestAdapter();
-        mAdapter.updateTestModelIds(mItems);
 
         mSelectionPredicate = new SelectionPredicate<String>() {
 
@@ -103,23 +100,23 @@
 
     @Test
     public void testSelect() {
-        mTracker.select(mItems.get(7));
+        mTracker.select(mAdapter.getSelectionKey(7));
 
         mSelection.assertSelection(7);
     }
 
     @Test
     public void testDeselect() {
-        mTracker.select(mItems.get(7));
-        mTracker.deselect(mItems.get(7));
+        mTracker.select(mAdapter.getSelectionKey(7));
+        mTracker.deselect(mAdapter.getSelectionKey(7));
 
         mSelection.assertNoSelection();
     }
 
     @Test
     public void testSelection_DoNothingOnUnselectableItem() {
-        mIgnored.add(mItems.get(7));
-        boolean selected = mTracker.select(mItems.get(7));
+        mIgnored.add(mAdapter.getSelectionKey(7));
+        boolean selected = mTracker.select(mAdapter.getSelectionKey(7));
 
         assertFalse(selected);
         mSelection.assertNoSelection();
@@ -127,37 +124,37 @@
 
     @Test
     public void testSelect_NotifiesListenersOfChange() {
-        mTracker.select(mItems.get(7));
+        mTracker.select(mAdapter.getSelectionKey(7));
 
         mListener.assertSelectionChanged();
     }
 
     @Test
     public void testSelect_NotifiesAdapterOfSelect() {
-        mTracker.select(mItems.get(7));
+        mTracker.select(mAdapter.getSelectionKey(7));
 
         mAdapter.assertNotifiedOfSelectionChange(7);
     }
 
     @Test
     public void testSelect_NotifiesAdapterOfDeselect() {
-        mTracker.select(mItems.get(7));
+        mTracker.select(mAdapter.getSelectionKey(7));
         mAdapter.resetSelectionNotifications();
-        mTracker.deselect(mItems.get(7));
+        mTracker.deselect(mAdapter.getSelectionKey(7));
         mAdapter.assertNotifiedOfSelectionChange(7);
     }
 
     @Test
     public void testDeselect_SelectionChange_Notifies() {
-        mTracker.select(mItems.get(7));
-        mTracker.deselect(mItems.get(7));
+        mTracker.select(mAdapter.getSelectionKey(7));
+        mTracker.deselect(mAdapter.getSelectionKey(7));
 
         mListener.assertSelectionChanged();
     }
 
     @Test
     public void testClearSelection_ClearSelection_Notifies() {
-        mTracker.select(mItems.get(7));
+        mTracker.select(mAdapter.getSelectionKey(7));
         mTracker.clearSelection();
 
         mListener.assertSelectionCleared();
@@ -175,8 +172,11 @@
 
     @Test
     public void testSelection_PersistsOnUpdate() {
-        mTracker.select(mItems.get(7));
-        mAdapter.updateTestModelIds(mItems);
+        mTracker.select(mAdapter.getSelectionKey(7));
+
+        List<String> newItems = new ArrayList<>();
+        newItems.addAll(mAdapter.getItems().subList(0, 10));
+        mAdapter.updateTestModelIds(newItems);
 
         mSelection.assertSelection(7);
     }
@@ -190,7 +190,7 @@
 
     @Test
     public void testSetItemsSelected_SkipUnselectableItem() {
-        mIgnored.add(mItems.get(7));
+        mIgnored.add(mAdapter.getSelectionKey(7));
 
         mTracker.setItemsSelected(getStringIds(6, 7, 8), true);
 
@@ -201,8 +201,8 @@
 
     @Test
     public void testClearSelection_RemovesPrimarySelection() {
-        mTracker.select(mItems.get(1));
-        mTracker.select(mItems.get(2));
+        mTracker.select(mAdapter.getSelectionKey(1));
+        mTracker.select(mAdapter.getSelectionKey(2));
 
         assertTrue(mTracker.clearSelection());
 
@@ -212,8 +212,8 @@
     @Test
     public void testClearSelection_RemovesProvisionalSelection() {
         Set<String> prov = new HashSet<>();
-        prov.add(mItems.get(1));
-        prov.add(mItems.get(2));
+        prov.add(mAdapter.getSelectionKey(1));
+        prov.add(mAdapter.getSelectionKey(2));
 
         assertFalse(mTracker.clearSelection());
         assertFalse(mTracker.hasSelection());
@@ -221,7 +221,7 @@
 
     @Test
     public void testRequiresReset_ForSelection() {
-        mTracker.select(mItems.get(1));
+        mTracker.select(mAdapter.getSelectionKey(1));
 
         assertTrue(mTracker.isResetRequired());
     }
@@ -229,7 +229,7 @@
     @Test
     public void testRequiresReset_ForProvisionalSelection() {
         Set<String> items = new HashSet<>();
-        items.add(mItems.get(1));
+        items.add(mAdapter.getSelectionKey(1));
 
         mTracker.setProvisionalSelection(items);
 
@@ -245,7 +245,7 @@
 
     @Test
     public void testReset_ForSelection() {
-        mTracker.select(mItems.get(1));
+        mTracker.select(mAdapter.getSelectionKey(1));
 
         mTracker.reset();
         assertFalse(mTracker.isResetRequired());
@@ -254,7 +254,7 @@
     @Test
     public void testReset_ForProvisionalSelection() {
         Set<String> items = new HashSet<>();
-        items.add(mItems.get(1));
+        items.add(mAdapter.getSelectionKey(1));
         mTracker.setProvisionalSelection(items);
 
         mTracker.reset();
@@ -263,10 +263,10 @@
 
     @Test
     public void testReset_Combined() {
-        mTracker.select(mItems.get(1));
+        mTracker.select(mAdapter.getSelectionKey(1));
 
         Set<String> items = new HashSet<>();
-        items.add(mItems.get(1));
+        items.add(mAdapter.getSelectionKey(1));
         mTracker.setProvisionalSelection(items);
 
         mTracker.startRange(15);
@@ -292,7 +292,7 @@
 
     @Test
     public void testRangeSelection_SkipUnselectableItem() {
-        mIgnored.add(mItems.get(17));
+        mIgnored.add(mAdapter.getSelectionKey(17));
 
         mTracker.startRange(15);
         mTracker.extendRange(19);
@@ -391,8 +391,8 @@
         mSelection.assertNoSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(mItems.get(1), true);
-        mListener.onItemStateChanged(mItems.get(2), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(2), true);
 
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(1, true);
@@ -406,19 +406,19 @@
         Selection<String> s = mTracker.getSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(mItems.get(1), true);
-        mListener.onItemStateChanged(mItems.get(2), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(2), true);
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(1, true);
         provisional.append(2, true);
         s.setProvisionalSelection(getItemIds(provisional));
 
-        mListener.onItemStateChanged(mItems.get(1), false);
-        mListener.onItemStateChanged(mItems.get(2), false);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(1), false);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(2), false);
         provisional.clear();
 
-        mListener.onItemStateChanged(mItems.get(3), true);
-        mListener.onItemStateChanged(mItems.get(4), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(3), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(4), true);
         provisional.append(3, true);
         provisional.append(4, true);
         s.setProvisionalSelection(getItemIds(provisional));
@@ -430,18 +430,18 @@
         Selection<String> s = mTracker.getSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(mItems.get(1), true);
-        mListener.onItemStateChanged(mItems.get(2), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(2), true);
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(1, true);
         provisional.append(2, true);
         s.setProvisionalSelection(getItemIds(provisional));
 
-        mListener.onItemStateChanged(mItems.get(1), false);
-        mListener.onItemStateChanged(mItems.get(2), false);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(1), false);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(2), false);
         provisional.clear();
 
-        mListener.onItemStateChanged(mItems.get(1), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
         provisional.append(1, true);
         s.setProvisionalSelection(getItemIds(provisional));
         mSelection.assertSelection(1);
@@ -452,8 +452,8 @@
         Selection<String> s = mTracker.getSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(mItems.get(1), true);
-        mListener.onItemStateChanged(mItems.get(2), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(2), true);
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(1, true);
         provisional.append(2, true);
@@ -465,8 +465,8 @@
 
     @Test
     public void testProvisionalSelection_Cancel() {
-        mTracker.select(mItems.get(1));
-        mTracker.select(mItems.get(2));
+        mTracker.select(mAdapter.getSelectionKey(1));
+        mTracker.select(mAdapter.getSelectionKey(2));
         Selection<String> s = mTracker.getSelection();
 
         SparseBooleanArray provisional = new SparseBooleanArray();
@@ -481,12 +481,12 @@
 
     @Test
     public void testProvisionalSelection_IntersectsAppliedSelection() {
-        mTracker.select(mItems.get(1));
-        mTracker.select(mItems.get(2));
+        mTracker.select(mAdapter.getSelectionKey(1));
+        mTracker.select(mAdapter.getSelectionKey(2));
         Selection<String> s = mTracker.getSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(mItems.get(3), true);
+        mListener.onItemStateChanged(mAdapter.getSelectionKey(3), true);
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(2, true);
         provisional.append(3, true);
@@ -499,7 +499,7 @@
 
         int count = selection.size();
         for (int i = 0; i < count; ++i) {
-            ids.add(mItems.get(selection.keyAt(i)));
+            ids.add(mAdapter.getSelectionKey(selection.keyAt(i)));
         }
 
         return ids;
@@ -522,11 +522,11 @@
         mSelection = new SelectionProbe(mTracker, mListener);
 
         for (int i = 2; i < 7; i++) {
-            mTracker.select(mItems.get(i));
+            mTracker.select(mAdapter.getSelectionKey(i));
         }
 
-        mIgnored.add(mItems.get(3));
-        mIgnored.add(mItems.get(5));
+        mIgnored.add(mAdapter.getSelectionKey(3));
+        mIgnored.add(mAdapter.getSelectionKey(5));
 
         mAdapter.notifyDataSetChanged();
 
@@ -571,7 +571,7 @@
     private Iterable<String> getStringIds(int... ids) {
         List<String> stringIds = new ArrayList<>(ids.length);
         for (int id : ids) {
-            stringIds.add(mItems.get(id));
+            stringIds.add(mAdapter.getSelectionKey(id));
         }
         return stringIds;
     }
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
index 438c938..6dac018 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
@@ -27,32 +27,28 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.List;
-
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class DefaultSelectionTracker_SingleSelectTest {
 
-    private List<String> mItems;
     private SelectionTracker<String> mTracker;
+    private TestAdapter<String> mAdapter;
     private TestSelectionObserver<String> mListener;
     private SelectionProbe mSelection;
 
     @Before
     public void setUp() throws Exception {
-        mItems = TestAdapter.createItemList(100);
+        mAdapter = TestAdapter.createStringAdapter(100);
         mListener = new TestSelectionObserver<>();
-        TestAdapter<String> adapter = new TestAdapter<>();
-        adapter.updateTestModelIds(mItems);
 
         ItemKeyProvider<String> keyProvider =
-                new TestItemKeyProvider<>(ItemKeyProvider.SCOPE_MAPPED, adapter);
+                new TestItemKeyProvider<>(ItemKeyProvider.SCOPE_MAPPED, mAdapter);
         mTracker = new DefaultSelectionTracker<>(
                 "single-selection-test",
                 keyProvider,
                 SelectionPredicates.createSelectSingleAnything(),
                 StorageStrategy.createStringStorage());
-        EventBridge.install(adapter, mTracker, keyProvider);
+        EventBridge.install(mAdapter, mTracker, keyProvider);
 
         mTracker.addObserver(mListener);
 
@@ -61,15 +57,16 @@
 
     @Test
     public void testSimpleSelect() {
-        mTracker.select(mItems.get(3));
-        mTracker.select(mItems.get(4));
+        mTracker.select(mAdapter.getSelectionKey(3));
+        mTracker.select(mAdapter.getSelectionKey(4));
         mListener.assertSelectionChanged();
+        // 3 should no longer be selected because of single select mode.
         mSelection.assertSelection(4);
     }
 
     @Test
     public void testRangeSelectionNotEstablished() {
-        mTracker.select(mItems.get(3));
+        mTracker.select(mAdapter.getSelectionKey(3));
         mListener.reset();
 
         mTracker.extendRange(10);
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/StableIdKeyProviderTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/StableIdKeyProviderTest.java
index 33c0c80..92089428 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/StableIdKeyProviderTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/StableIdKeyProviderTest.java
@@ -16,10 +16,22 @@
 
 package androidx.recyclerview.selection;
 
+import static androidx.recyclerview.selection.StableIdKeyProvider.ViewHost;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
 import android.content.Context;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.selection.testing.TestAdapter;
+import androidx.recyclerview.selection.testing.TestHolder;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
@@ -28,30 +40,139 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class StableIdKeyProviderTest {
 
     private Context mContext;
-    private RecyclerView mRecyclerView;
+    private StableIdTestAdapter mAdapter;
+    private TestViewHost mHost;
     private StableIdKeyProvider mKeyProvider;
 
     @Before
     public void setUp() {
         mContext = ApplicationProvider.getApplicationContext();
-        mRecyclerView = new RecyclerView(mContext);
-        mKeyProvider = new StableIdKeyProvider(mRecyclerView);
+        mAdapter = new StableIdTestAdapter();
+        mHost = new TestViewHost(mContext, mAdapter);
+        mKeyProvider = new StableIdKeyProvider(mHost);
     }
 
     @Test
-    public void testOnAttached_NullViewHolder() {
-        View v = new View(mContext);
-        mKeyProvider.onAttached(v);
+    public void testNotAttached() {
+        assertEquals(RecyclerView.NO_POSITION, mKeyProvider.getPosition(1L));
+        assertNull(mKeyProvider.getKey(1));
     }
 
     @Test
-    public void testOnDetatched_NullViewHolder() {
-        View v = new View(mContext);
-        mKeyProvider.onDetached(v);
+    public void testAttachedItems() {
+        mHost.addViewHolder(1);
+        mHost.addViewHolder(2);
+        assertEquals(Long.valueOf(1), mKeyProvider.getKey(1));
+        assertEquals(Long.valueOf(2), mKeyProvider.getKey(2));
+    }
+
+    @Test
+    public void testRecycledItems() {
+        mHost.addViewHolder(1);
+        mHost.addViewHolder(2);
+        mHost.removeViewHolder(1);
+        mHost.addViewHolder(3);
+        assertEquals(RecyclerView.NO_POSITION, mKeyProvider.getPosition(1L));
+        assertNull(mKeyProvider.getKey(1));
+        // Ensure item "2" remains accessible, and 3 is present.
+        assertEquals(Long.valueOf(2), mKeyProvider.getKey(2));
+        assertEquals(Long.valueOf(3), mKeyProvider.getKey(3));
+    }
+
+    private static class TestViewHost implements ViewHost, ViewHost.LifecycleListener {
+
+        Map<View, ViewHolder> mViews = new HashMap<>();
+        private @Nullable LifecycleListener mListener;
+        private final Context mContext;
+        private final StableIdTestAdapter mAdapter;
+
+        TestViewHost(Context context, StableIdTestAdapter adapter) {
+            mContext = context;
+            mAdapter = adapter;
+        }
+
+        void addViewHolder(int position) {
+            // This is usually implemented by findContainingViewHolder.
+            // Here we use the adapter, since it is providing holders in our test.
+            LinearLayout view = new LinearLayout(mContext);
+            TestHolder holder = mAdapter.getHolder(view, position);
+            mViews.put(view, holder);
+            onAttached(view);
+        }
+
+        void removeViewHolder(int position) {
+            View toRemove = null;
+            for (Map.Entry<View, ViewHolder> entry : mViews.entrySet()) {
+                if (entry.getValue().getLayoutPosition() == position) {
+                    toRemove = entry.getKey();
+                    break;
+                }
+            }
+
+            if (toRemove != null) {
+                onRecycled(toRemove);
+                // Defer removing until after listeners get notified.
+                mViews.remove(toRemove);
+            }
+
+        }
+
+        @Override
+        public void registerLifecycleListener(@NonNull LifecycleListener listener) {
+            mListener = listener;
+        }
+
+        @Override
+        public @Nullable ViewHolder findViewHolder(@NonNull View view) {
+            // This is usually implemented by findContainingViewHolder.
+            // Here we use the adapter, since it is providing holders in our test.
+            return mViews.get(view);
+        }
+
+        @Override
+        public int getPosition(@NonNull ViewHolder holder) {
+            // Note, we use getLayoutPosition rather than getAbsoluteAdapterPosition
+            // because the latter requires an owning RecyclerView.
+            // In lieu of that, we use getLayoutPosition which is set
+            // and stored as a field on the holder at the time the holder is bound.
+            // This is a small contrivance necessary to support testability.
+            return holder.getLayoutPosition();
+        }
+
+        @Override
+        public void onAttached(@NonNull View view) {
+            mListener.onAttached(view);
+        }
+
+        @Override
+        public void onRecycled(@NonNull View view) {
+            mListener.onRecycled(view);
+        }
+    }
+
+    private static final class StableIdTestAdapter extends TestAdapter<Long> {
+        StableIdTestAdapter() {
+            super(Collections.EMPTY_LIST, true);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        TestHolder getHolder(ViewGroup view, int position) {
+            TestHolder holder = new TestHolder(view);
+            bindViewHolder(holder, position);
+            return holder;
+        }
     }
 }
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestAdapter.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestAdapter.java
index 03702e2..99793d1 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestAdapter.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestAdapter.java
@@ -20,6 +20,7 @@
 
 import android.view.ViewGroup;
 
+import androidx.annotation.NonNull;
 import androidx.recyclerview.selection.SelectionTracker;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerView.Adapter;
@@ -40,7 +41,12 @@
     }
 
     public TestAdapter(List<K> items) {
+        this(items, false);
+    }
+
+    public TestAdapter(List<K> items, boolean hasStableIds) {
         mItems.addAll(items);
+        setHasStableIds(hasStableIds);
         mAdapterObserver = new RecyclerView.AdapterDataObserver() {
 
             @Override
@@ -75,13 +81,15 @@
     }
 
     @Override
-    public TestHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        return new TestHolder(parent);
+    public @NonNull TestHolder onCreateViewHolder(@NonNull ViewGroup view, int viewType) {
+        return new TestHolder(view);
     }
 
     @Override
-    public void onBindViewHolder(TestHolder holder, int position) {
-        throw new UnsupportedOperationException();
+    public void onBindViewHolder(@NonNull TestHolder holder, int position) {
+        // Ignore calls to this method which is called when bindViewHolder
+        // is called. Some tests depend on bindViewHolder setting up position
+        // and id information in ViewHolders.
     }
 
     @Override
@@ -104,7 +112,6 @@
         return mItems.get(position);
     }
 
-
     public void resetSelectionNotifications() {
         mNotifiedOfSelection.clear();
     }
@@ -113,11 +120,18 @@
         assertTrue(mNotifiedOfSelection.contains(position));
     }
 
-    public static List<String> createItemList(int num) {
+    /*
+     * Returns a reference to internal item list. Obvi for test only.
+     */
+    public List<K> getItems() {
+        return mItems;
+    }
+
+    public static TestAdapter<String> createStringAdapter(int num) {
         List<String> items = new ArrayList<>(num);
         for (int i = 0; i < num; ++i) {
             items.add(Integer.toString(i));
         }
-        return items;
+        return new TestAdapter<>(items);
     }
 }
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestHolder.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestHolder.java
index 055d102..b94399e 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestHolder.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestHolder.java
@@ -16,12 +16,12 @@
 
 package androidx.recyclerview.selection.testing;
 
-import android.view.View;
+import android.view.ViewGroup;
 
 import androidx.recyclerview.widget.RecyclerView.ViewHolder;
 
 public class TestHolder extends ViewHolder {
-    public TestHolder(View itemView) {
-        super(itemView);
+    public TestHolder(ViewGroup view) {
+        super(view);
     }
 }
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
index 61985cf..1083165 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
@@ -191,7 +191,7 @@
     private Selection<K> clearSelectionQuietly() {
         mRange = null;
 
-        MutableSelection<K> prevSelection = new MutableSelection();
+        MutableSelection<K> prevSelection = new MutableSelection<>();
         if (hasSelection()) {
             copySelection(prevSelection);
             mSelection.clear();
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
index 1cdf135..0c290ca 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
@@ -172,7 +172,8 @@
 
         /**
          * Returns the adapter position of the item. See
-         * {@link RecyclerView.ViewHolder#getAdapterPosition() ViewHolder.getAdapterPosition}
+         * {@link RecyclerView.ViewHolder#getAbsoluteAdapterPosition() ViewHolder
+         * .getAbsoluteAdapterPosition}
          *
          * @return the position of an item.
          */
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/StableIdKeyProvider.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/StableIdKeyProvider.java
index bfda007..648121c 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/StableIdKeyProvider.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/StableIdKeyProvider.java
@@ -16,6 +16,8 @@
 
 package androidx.recyclerview.selection;
 
+import static androidx.core.util.Preconditions.checkArgument;
+import static androidx.core.util.Preconditions.checkNotNull;
 import static androidx.recyclerview.selection.Shared.DEBUG;
 
 import android.util.Log;
@@ -27,16 +29,28 @@
 import androidx.collection.LongSparseArray;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener;
+import androidx.recyclerview.widget.RecyclerView.RecyclerListener;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
 
 /**
  * An {@link ItemKeyProvider} that provides stable ids by way of cached
- * {@link RecyclerView.Adapter} stable ids. Items enter the cache as they are laid out by
- * RecyclerView, and are removed from the cache as they are recycled.
+ * {@link RecyclerView.Adapter} stable ids. Items enter the cache as they are
+ * attached by RecyclerView and are removed when they are recycled.
  *
  * <p>
  * There are trade-offs with this implementation as it necessarily auto-boxes {@code long}
  * stable id values into {@code Long} values for use as selection keys. The core Selection API
  * uses a parameterized key type to permit other keys (such as Strings or URIs).
+ *
+ * <p>
+ * FYI: Use of StableIdKeyProvider limits the availability of some features
+ * such as mouse-driven band selection that may otherwise provide an enhanced
+ * experience for users of ChromeOS or other devices with attached pointing devices.
+ * For that reason,  consider implementing your own {@link ItemKeyProvider}
+ * that can provide item keys based on your item data, such as a stable
+ * {@link android.net.Uri} or other unique identifier. For an example of
+ * such a provider see com.example.android.supportv7.widget.selection.fancy.DemoAdapter.KeyProvider
+ * in the SupportV7 Demos package.
  */
 public final class StableIdKeyProvider extends ItemKeyProvider<Long> {
 
@@ -44,7 +58,32 @@
 
     private final SparseArray<Long> mPositionToKey = new SparseArray<>();
     private final LongSparseArray<Integer> mKeyToPosition = new LongSparseArray<>();
-    private final RecyclerView mRecyclerView;
+    private final ViewHost mHost;
+
+    StableIdKeyProvider(@NonNull ViewHost host) {
+        // Provider is based on the stable ids provided by ViewHolders which
+        // are only accessible when the holders are attached or yet-to-be-recycled.
+        // For that reason we can only satisfy "CACHED" scope key access which
+        // limits library features such as mouse-driven band selection.
+        super(SCOPE_CACHED);
+
+        checkNotNull(host);
+        mHost = host;
+
+        mHost.registerLifecycleListener(
+                new ViewHost.LifecycleListener() {
+                    @Override
+                    public void onAttached(@NonNull View view) {
+                        StableIdKeyProvider.this.onAttached(view);
+                    }
+
+                    @Override
+                    public void onRecycled(@NonNull View view) {
+                        StableIdKeyProvider.this.onRecycled(view);
+                    }
+                }
+        );
+    }
 
     /**
      * Creates a new key provider that uses cached {@code long} stable ids associated
@@ -53,39 +92,23 @@
      * @param recyclerView the owner RecyclerView
      */
     public StableIdKeyProvider(@NonNull RecyclerView recyclerView) {
+        this(new DefaultViewHost(recyclerView));
 
-        // Since this provide is based on stable ids based on whats laid out in the window
-        // we can only satisfy "window" scope key access.
-        super(SCOPE_CACHED);
-
-        mRecyclerView = recyclerView;
-
-        mRecyclerView.addOnChildAttachStateChangeListener(
-                new OnChildAttachStateChangeListener() {
-                    @Override
-                    public void onChildViewAttachedToWindow(View view) {
-                        onAttached(view);
-                    }
-
-                    @Override
-                    public void onChildViewDetachedFromWindow(View view) {
-                        onDetached(view);
-                    }
-                }
-        );
-
+        // Adapters used w/ StableIdKeyProvider MUST have StableIds enabled.
+        checkArgument(recyclerView.getAdapter().hasStableIds(), "RecyclerView"
+                + ".Adapter#hasStableIds must return true.");
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic access */
     void onAttached(@NonNull View view) {
-        RecyclerView.ViewHolder holder = mRecyclerView.findContainingViewHolder(view);
+        ViewHolder holder = mHost.findViewHolder(view);
         if (holder == null) {
             if (DEBUG) {
                 Log.w(TAG, "Unable to find ViewHolder for View. Ignoring onAttached event.");
             }
             return;
         }
-        int position = holder.getAbsoluteAdapterPosition();
+        int position = mHost.getPosition(holder);
         long id = holder.getItemId();
         if (position != RecyclerView.NO_POSITION && id != RecyclerView.NO_ID) {
             mPositionToKey.put(position, id);
@@ -94,15 +117,15 @@
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic access */
-    void onDetached(@NonNull View view) {
-        RecyclerView.ViewHolder holder = mRecyclerView.findContainingViewHolder(view);
+    void onRecycled(@NonNull View view) {
+        ViewHolder holder = mHost.findViewHolder(view);
         if (holder == null) {
             if (DEBUG) {
                 Log.w(TAG, "Unable to find ViewHolder for View. Ignoring onDetached event.");
             }
             return;
         }
-        int position = holder.getAbsoluteAdapterPosition();
+        int position = mHost.getPosition(holder);
         long id = holder.getItemId();
         if (position != RecyclerView.NO_POSITION && id != RecyclerView.NO_ID) {
             mPositionToKey.delete(position);
@@ -112,6 +135,8 @@
 
     @Override
     public @Nullable Long getKey(int position) {
+        // TODO: Consider using RecyclerView.NO_ID for consistency w/ getPosition impl.
+        // Currently GridModel impl depends on null return values.
         return mPositionToKey.get(position, null);
     }
 
@@ -119,4 +144,91 @@
     public int getPosition(@NonNull Long key) {
         return mKeyToPosition.get(key, RecyclerView.NO_POSITION);
     }
+
+    /**
+     * A wrapper interface for RecyclerView allowing for easy unit testing.
+     */
+    interface ViewHost {
+        /** Registers View{Holder} lifecycle event listener. **/
+        void registerLifecycleListener(@NonNull LifecycleListener listener);
+
+        /**
+         * Returns the ViewHolder containing {@code View}.
+         */
+        @Nullable ViewHolder findViewHolder(@NonNull View view);
+
+        /**
+         * Returns the position of the ViewHolder, or RecyclerView.NO_POSITION
+         * if unknown.
+         *
+         * This method supports testing of StableIdKeyProvider independent of
+         * a real RecyclerView instance. The correct runtime implementation is
+         * {@code return holder.getAbsoluteAdapterPosition}. This implementation
+         * depends on a concrete RecyclerView instance, which isn't test friendly
+         * given the testing approach in StableIdKeyProviderTest. Thus the
+         * introduction of this interface method allowing a test double to
+         * supply adapter position as needed to test.
+         */
+        int getPosition(@NonNull ViewHolder holder);
+
+        /** A View{Holder} lifecycle listener interface. */
+        interface LifecycleListener {
+
+            /** Called when view is attached. */
+            void onAttached(@NonNull View view);
+
+            /** Called when view is recycled. */
+            void onRecycled(@NonNull View view);
+        }
+    }
+
+    /**
+     * Implementation of ViewHost that wraps a RecyclerView instance.
+     */
+    private static class DefaultViewHost implements ViewHost {
+        private final @NonNull RecyclerView mRecyclerView;
+
+        DefaultViewHost(@NonNull RecyclerView recyclerView) {
+            checkNotNull(recyclerView);
+            mRecyclerView = recyclerView;
+        }
+
+        @Override
+        public void registerLifecycleListener(@NonNull LifecycleListener listener) {
+
+            mRecyclerView.addOnChildAttachStateChangeListener(
+                    new OnChildAttachStateChangeListener() {
+                        @Override
+                        public void onChildViewAttachedToWindow(@NonNull View view) {
+                            listener.onAttached(view);
+                        }
+
+                        @Override
+                        public void onChildViewDetachedFromWindow(@NonNull View view) {
+                            // Cached position <> key data is discarded only when
+                            // a view is recycled. See b/145767095 for details.
+                        }
+                    }
+            );
+
+            mRecyclerView.setRecyclerListener(
+                    new RecyclerListener() {
+                        @Override
+                        public void onViewRecycled(@NonNull ViewHolder holder) {
+                            listener.onRecycled(holder.itemView);
+                        }
+                    }
+            );
+        }
+
+        @Override
+        public @Nullable ViewHolder findViewHolder(@NonNull View view) {
+            return mRecyclerView.findContainingViewHolder(view);
+        }
+
+        @Override
+        public int getPosition(@NonNull ViewHolder holder) {
+            return holder.getAbsoluteAdapterPosition();
+        }
+    }
 }
diff --git a/samples/Support7Demos/src/main/AndroidManifest.xml b/samples/Support7Demos/src/main/AndroidManifest.xml
index 13a7051..551f5b6 100644
--- a/samples/Support7Demos/src/main/AndroidManifest.xml
+++ b/samples/Support7Demos/src/main/AndroidManifest.xml
@@ -746,6 +746,16 @@
         </activity>
 
         <!-- Selection helper demo activity -->
+        <activity android:name=".widget.selection.single.SingleStableIdSelectionDemoActivity"
+            android:label="@string/single_selection_demo_activity"
+            android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <!-- Selection helper demo activity -->
         <activity android:name=".widget.selection.simple.SimpleSelectionDemoActivity"
                   android:label="@string/simple_selection_demo_activity"
                   android:theme="@style/Theme.AppCompat.Light">
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoAdapter.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java
similarity index 83%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoAdapter.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java
index 804e7ec..c0016e9 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoAdapter.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java
@@ -36,7 +36,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-final class FancySelectionDemoAdapter extends RecyclerView.Adapter<FancyHolder> {
+final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
 
     public static final int TYPE_HEADER = 1;
     public static final int TYPE_ITEM = 2;
@@ -54,7 +54,7 @@
         }
     };
 
-    FancySelectionDemoAdapter(Context context) {
+    DemoAdapter(Context context) {
         mContext = context;
         mKeyProvider = new KeyProvider("cheeses", Cheeses.sCheeseStrings);
 
@@ -98,13 +98,13 @@
     }
 
     @Override
-    public void onBindViewHolder(@NonNull FancyHolder holder, int position) {
-        if (holder instanceof FancyHeaderHolder) {
+    public void onBindViewHolder(@NonNull DemoHolder holder, int position) {
+        if (holder instanceof DemoHeaderHolder) {
             Uri uri = mKeyProvider.getKey(position);
-            ((FancyHeaderHolder) holder).update(uri.getPathSegments().get(0));
-        } else if (holder instanceof FancyItemHolder) {
+            ((DemoHeaderHolder) holder).update(uri.getPathSegments().get(0));
+        } else if (holder instanceof DemoItemHolder) {
             Uri uri = mKeyProvider.getKey(position);
-            ((FancyItemHolder) holder).update(uri, uri.getPathSegments().get(1),
+            ((DemoItemHolder) holder).update(uri, uri.getPathSegments().get(1),
                     mSelTest.isSelected(uri));
         }
     }
@@ -122,13 +122,13 @@
     }
 
     @Override
-    public FancyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+    public DemoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         switch (viewType) {
             case TYPE_HEADER:
-                return new FancyHeaderHolder(
+                return new DemoHeaderHolder(
                         inflateLayout(mContext, parent, R.layout.selection_demo_list_header));
             case TYPE_ITEM:
-                return new FancyItemHolder(
+                return new DemoItemHolder(
                         inflateLayout(mContext, parent, R.layout.selection_demo_list_item));
         }
         throw new RuntimeException("Unsupported view type" + viewType);
@@ -145,7 +145,19 @@
         boolean isSelected(Uri id);
     }
 
-    private static final class KeyProvider extends ItemKeyProvider<Uri> {
+    /**
+     * When ever possible provide the selection library with a
+     * "SCOPED_MAPPED" ItemKeyProvider. This enables the selection
+     * library to provide ChromeOS friendly features such as mouse-driven
+     * band selection.
+     *
+     * Background: SCOPED_MAPPED providers allow the library to access
+     * an item's key or position independently of how the data is
+     * represented in the RecyclerView. This is useful in that it
+     * allows the library to operate on items that are not currently laid
+     * out in RecyclerView.
+     */
+    static final class KeyProvider extends ItemKeyProvider<Uri> {
 
         private final Uri[] mUris;
         private final Map<Uri, Integer> mPositions;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java
similarity index 87%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java
index c2d57f0..eaf1dfd 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java
@@ -28,11 +28,11 @@
 /**
  * Access to details of an item associated with a {@link MotionEvent} instance.
  */
-final class FancyDetailsLookup extends ItemDetailsLookup<Uri> {
+final class DemoDetailsLookup extends ItemDetailsLookup<Uri> {
 
     private final RecyclerView mRecView;
 
-    FancyDetailsLookup(RecyclerView view) {
+    DemoDetailsLookup(RecyclerView view) {
         mRecView = view;
     }
 
@@ -41,8 +41,8 @@
         @Nullable View view = mRecView.findChildViewUnder(e.getX(), e.getY());
         if (view != null) {
             ViewHolder holder = mRecView.getChildViewHolder(view);
-            if (holder instanceof FancyItemHolder) {
-                return ((FancyItemHolder) holder).getItemDetails();
+            if (holder instanceof DemoItemHolder) {
+                return ((DemoItemHolder) holder).getItemDetails();
             }
             // FancyHeaderHolder doesn't hold a selectable item,
             // so it doesn't support getItemDetails.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHeaderHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java
similarity index 93%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHeaderHolder.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java
index 4ed2d1f..24f73ca 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHeaderHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java
@@ -21,12 +21,12 @@
 
 import com.example.android.supportv7.R;
 
-final class FancyHeaderHolder extends FancyHolder {
+final class DemoHeaderHolder extends DemoHolder {
 
     private static final String HEADER_TAG = "I'm a header";
     public final TextView mLabel;
 
-    FancyHeaderHolder(LinearLayout layout) {
+    DemoHeaderHolder(LinearLayout layout) {
         super(layout);
         layout.setTag(HEADER_TAG);
         mLabel = layout.findViewById(R.id.label);
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java
similarity index 88%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHolder.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java
index 6fbc206..0c6b999 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java
@@ -20,8 +20,8 @@
 
 import androidx.recyclerview.widget.RecyclerView;
 
-abstract class FancyHolder extends RecyclerView.ViewHolder {
-    FancyHolder(LinearLayout layout) {
+abstract class DemoHolder extends RecyclerView.ViewHolder {
+    DemoHolder(LinearLayout layout) {
         super(layout);
     }
 }
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java
similarity index 90%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java
index 944e200..176fb3d 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java
@@ -27,7 +27,7 @@
 
 import com.example.android.supportv7.R;
 
-final class FancyItemHolder extends FancyHolder {
+final class DemoItemHolder extends DemoHolder {
 
     private final LinearLayout mContainer;
     private final TextView mSelector;
@@ -36,7 +36,7 @@
 
     private @Nullable Uri mKey;
 
-    FancyItemHolder(LinearLayout layout) {
+    DemoItemHolder(LinearLayout layout) {
         super(layout);
 
         mContainer = layout.findViewById(R.id.container);
@@ -45,28 +45,28 @@
         mDetails = new ItemDetails<Uri>() {
             @Override
             public int getPosition() {
-                return FancyItemHolder.this.getBindingAdapterPosition();
+                return DemoItemHolder.this.getAbsoluteAdapterPosition();
             }
 
             @Override
             public Uri getSelectionKey() {
-                return FancyItemHolder.this.mKey;
+                return DemoItemHolder.this.mKey;
             }
 
             @Override
             public boolean inDragRegion(@NonNull MotionEvent e) {
-                return FancyItemHolder.this.inDragRegion(e);
+                return DemoItemHolder.this.inDragRegion(e);
             }
 
             @Override
             public boolean inSelectionHotspot(@NonNull MotionEvent e) {
-                return FancyItemHolder.this.inSelectRegion(e);
+                return DemoItemHolder.this.inSelectRegion(e);
             }
 
             @NonNull
             @Override
             public String toString() {
-                return FancyItemHolder.this.toString();
+                return DemoItemHolder.this.toString();
             }
         };
     }
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java
index 38e0046..ba3a945 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java
@@ -45,19 +45,29 @@
 import com.example.android.supportv7.R;
 
 /**
- * ContentPager demo activity.
+ * RecyclerView Selection library fancy demo activity. The fancy
+ * demo includes support for both touch and mouse (band) driven selection.
+ * Use this activity as your example when implementing an activity/fragment
+ * that will run on a wide range of devices, including devices like ChromeOS
+ * where a pointing device may be present, or even the sole means of input.
+ *
+ * <p>The key to an implementation that provides mouse support is
+ * to provide an {@link ItemKeyProvider} that is
+ * {@link ItemKeyProvider#SCOPE_MAPPED}. This means the key provider
+ * can supply information about both position and item key at any time,
+ * even when an item is not attached to the recycler view. See
+ * {@link DemoAdapter.KeyProvider} for an example of a SCOPE_MAPPED
+ * provider that uses simple {@link Uri}s as the keys.
  */
 public class FancySelectionDemoActivity extends AppCompatActivity {
 
     private static final String TAG = "SelectionDemos";
-    private static final String EXTRA_COLUMN_COUNT = "demo-column-count";
 
     private RecyclerView mRecView;
-    private FancySelectionDemoAdapter mAdapter;
+    private DemoAdapter mAdapter;
     private SelectionTracker<Uri> mSelectionTracker;
 
     private GridLayoutManager mLayout;
-    private int mColumnCount = 1;  // This will get updated when layout changes.
     private boolean mIterceptListenerEnabled = false;
 
     @Override
@@ -80,7 +90,7 @@
             @Override
             public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
                 return mIterceptListenerEnabled
-                        && FancyHeaderHolder.isHeader(rv.findChildViewUnder(e.getX(), e.getY()));
+                        && DemoHeaderHolder.isHeader(rv.findChildViewUnder(e.getX(), e.getY()));
             }
 
             @Override
@@ -93,9 +103,9 @@
             }
         });
 
-        mLayout = new GridLayoutManager(this, mColumnCount);
+        mLayout = new GridLayoutManager(this, 1);
         mRecView.setLayoutManager(mLayout);
-        mAdapter = new FancySelectionDemoAdapter(this);
+        mAdapter = new DemoAdapter(this);
         mRecView.setAdapter(mAdapter);
         ItemKeyProvider<Uri> keyProvider = mAdapter.getItemKeyProvider();
 
@@ -103,18 +113,25 @@
                 "fancy-demo",
                 mRecView,
                 keyProvider,
-                new FancyDetailsLookup(mRecView),
+                new DemoDetailsLookup(mRecView),
                 StorageStrategy.createParcelableStorage(Uri.class));
 
-        // Override default behaviors and build in multi select mode.
-        // Call .withSelectionPredicate(SelectionTracker.SelectionPredicate.SINGLE_ANYTHING)
-        // for single selection mode.
+        // Build a multi-selection enabled tracker with support for many
+        // mouse/keyboard centric niceties friendly to ChromeOS users
+        // of your app.
         mSelectionTracker = builder
                 .withSelectionPredicate(SelectionPredicates.createSelectAnything())
+                // Allow users to drag a selection, can be initiated by long pressing
+                // on existing selection, or click-dragging with a mouse.
                 .withOnDragInitiatedListener(new OnDragInitiatedListener(this))
+                // Respond to context clicks allows you to add options for mouse users.
                 .withOnContextClickListener(new OnContextClickListener())
                 .withOnItemActivatedListener(new OnItemActivatedListener(this))
+                // Keep track of item focus which can aid in creating desirable
+                // keyboard based experiences for users on laptops.
                 .withFocusDelegate(new FocusDelegate())
+                // Use a custom band overlay when mouse selection is active.
+                // The library provides a default resource.
                 .withBandOverlay(R.drawable.selection_demo_band_overlay)
                 .build();
 
@@ -139,18 +156,10 @@
     protected void onSaveInstanceState(@NonNull Bundle state) {
         super.onSaveInstanceState(state);
         mSelectionTracker.onSaveInstanceState(state);
-        state.putInt(EXTRA_COLUMN_COUNT, mColumnCount);
     }
 
     private void updateFromSavedState(Bundle state) {
         mSelectionTracker.onRestoreInstanceState(state);
-
-        if (state != null) {
-            if (state.containsKey(EXTRA_COLUMN_COUNT)) {
-                mColumnCount = state.getInt(EXTRA_COLUMN_COUNT);
-                mLayout.setSpanCount(mColumnCount);
-            }
-        }
     }
 
     @Override
@@ -172,7 +181,7 @@
     }
 
     @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
+    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
         mIterceptListenerEnabled = !mIterceptListenerEnabled;
         return true;
     }
@@ -276,7 +285,7 @@
         }
 
         @Override
-        public boolean onItemActivated(ItemDetails<Uri> item, MotionEvent e) {
+        public boolean onItemActivated(@NonNull ItemDetails<Uri> item, @NonNull MotionEvent e) {
             toast(mContext, "Activate item: " + item);
             return true;
         }
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
index 5ca576d..c4853bd 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
@@ -32,7 +32,7 @@
 import com.example.android.supportv7.Cheeses;
 import com.example.android.supportv7.R;
 
-final class SimpleSelectionDemoAdapter extends RecyclerView.Adapter<DemoHolder> {
+final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
 
     private static final String TAG = "SelectionDemos";
     private final Context mContext;
@@ -41,7 +41,7 @@
     // asks SelectionTracker.
     private SelectionTest mSelTest;
 
-    SimpleSelectionDemoAdapter(Context context) {
+    DemoAdapter(Context context) {
         mContext = context;
         mSelTest = id -> {
             throw new IllegalStateException(
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java
index 9edbdd8..ab0ffa8 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java
@@ -41,7 +41,7 @@
         mDetails = new ItemDetails<Long>() {
             @Override
             public int getPosition() {
-                return DemoHolder.this.getBindingAdapterPosition();
+                return DemoHolder.this.getAbsoluteAdapterPosition();
             }
 
             @Override
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java
index 63fda61..d946c27 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java
@@ -22,6 +22,7 @@
 import android.view.MotionEvent;
 import android.widget.Toast;
 
+import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
 import androidx.recyclerview.selection.ItemKeyProvider;
@@ -36,18 +37,15 @@
 import com.example.android.supportv7.R;
 
 /**
- * ContentPager demo activity.
+ * RecyclerView Selection library simple demo activity.
  */
 public class SimpleSelectionDemoActivity extends AppCompatActivity {
 
     private static final String TAG = "SelectionDemos";
-    private static final String EXTRA_COLUMN_COUNT = "demo-column-count";
 
-    private SimpleSelectionDemoAdapter mAdapter;
+    private DemoAdapter mAdapter;
     private SelectionTracker<Long> mSelectionTracker;
-
     private GridLayoutManager mLayout;
-    private int mColumnCount = 1;  // This will get updated when layout changes.
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -56,13 +54,10 @@
         setContentView(R.layout.selection_demo_layout);
         RecyclerView recView = findViewById(R.id.list);
 
-        // keyProvider depends on mAdapter.setHasStableIds(true).
-        ItemKeyProvider<Long> keyProvider = new StableIdKeyProvider(recView);
-
-        mLayout = new GridLayoutManager(this, mColumnCount);
+        mLayout = new GridLayoutManager(this, 1);
         recView.setLayoutManager(mLayout);
 
-        mAdapter = new SimpleSelectionDemoAdapter(this);
+        mAdapter = new DemoAdapter(this);
         // The adapter is paired with a key provider that supports
         // the native RecyclerView stableId. For this to work correctly
         // the adapter must report that it supports stable ids.
@@ -70,6 +65,9 @@
 
         recView.setAdapter(mAdapter);
 
+        // keyProvider depends on mAdapter.setHasStableIds(true).
+        ItemKeyProvider<Long> keyProvider = new StableIdKeyProvider(recView);
+
         SelectionTracker.Builder<Long> builder = new SelectionTracker.Builder<>(
                 "simple-demo",
                 recView,
@@ -77,16 +75,9 @@
                 new DemoDetailsLookup(recView),
                 StorageStrategy.createLongStorage());
 
-        // Override default behaviors and build in multi select mode.
-        // Call .withSelectionPredicate(SelectionTracker.SelectionPredicate.SINGLE_ANYTHING)
-        // for single selection mode.
         mSelectionTracker = builder
                 .withSelectionPredicate(SelectionPredicates.createSelectAnything())
-                .withOnDragInitiatedListener(new OnDragInitiatedListener(this))
-                .withOnContextClickListener(new OnContextClickListener(this))
                 .withOnItemActivatedListener(new OnItemActivatedListener(this))
-                .withFocusDelegate(new FocusDelegate(this))
-                .withBandOverlay(R.drawable.selection_demo_band_overlay)
                 .build();
 
         // Lazily bind SelectionTracker. Allows us to defer initialization of the
@@ -107,21 +98,13 @@
     }
 
     @Override
-    protected void onSaveInstanceState(Bundle state) {
+    protected void onSaveInstanceState(@NonNull Bundle state) {
         super.onSaveInstanceState(state);
         mSelectionTracker.onSaveInstanceState(state);
-        state.putInt(EXTRA_COLUMN_COUNT, mColumnCount);
     }
 
     private void updateFromSavedState(Bundle state) {
         mSelectionTracker.onRestoreInstanceState(state);
-
-        if (state != null) {
-            if (state.containsKey(EXTRA_COLUMN_COUNT)) {
-                mColumnCount = state.getInt(EXTRA_COLUMN_COUNT);
-                mLayout.setSpanCount(mColumnCount);
-            }
-        }
     }
 
     @Override
@@ -161,73 +144,9 @@
         }
 
         @Override
-        public boolean onItemActivated(ItemDetails<Long> item, MotionEvent e) {
+        public boolean onItemActivated(@NonNull ItemDetails<Long> item, @NonNull MotionEvent e) {
             toast(mContext, "Activate item: " + item.getSelectionKey());
             return true;
         }
     }
-
-    private static final class FocusDelegate extends
-            androidx.recyclerview.selection.FocusDelegate<Long> {
-
-        private final Context mContext;
-
-        private FocusDelegate(Context context) {
-            mContext = context;
-        }
-
-        @Override
-        public void focusItem(ItemDetails<Long> item) {
-            toast(mContext, "Focused item: " + item.getSelectionKey());
-        }
-
-        @Override
-        public boolean hasFocusedItem() {
-            return false;
-        }
-
-        @Override
-        public int getFocusedPosition() {
-            return 0;
-        }
-
-        @Override
-        public void clearFocus() {
-            toast(mContext, "Cleared focus.");
-        }
-    }
-
-    // Implementation of MouseInputHandler.Callbacks allows handling
-    // of higher level events, like onActivated.
-    private static final class OnContextClickListener implements
-            androidx.recyclerview.selection.OnContextClickListener {
-
-        private final Context mContext;
-
-        OnContextClickListener(Context context) {
-            mContext = context;
-        }
-
-        @Override
-        public boolean onContextClick(MotionEvent e) {
-            toast(mContext, "Context click received.");
-            return true;
-        }
-    };
-
-    private static final class OnDragInitiatedListener implements
-            androidx.recyclerview.selection.OnDragInitiatedListener {
-
-        private final Context mContext;
-
-        private OnDragInitiatedListener(Context context) {
-            mContext = context;
-        }
-
-        @Override
-        public boolean onDragInitiated(MotionEvent e) {
-            toast(mContext, "onDragInitiated received.");
-            return true;
-        }
-    }
 }
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java
similarity index 93%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java
copy to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java
index 5ca576d..b56858d 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.supportv7.widget.selection.simple;
+package com.example.android.supportv7.widget.selection.single;
 
 import static androidx.core.util.Preconditions.checkArgument;
 
@@ -32,7 +32,7 @@
 import com.example.android.supportv7.Cheeses;
 import com.example.android.supportv7.R;
 
-final class SimpleSelectionDemoAdapter extends RecyclerView.Adapter<DemoHolder> {
+final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
 
     private static final String TAG = "SelectionDemos";
     private final Context mContext;
@@ -41,7 +41,7 @@
     // asks SelectionTracker.
     private SelectionTest mSelTest;
 
-    SimpleSelectionDemoAdapter(Context context) {
+    DemoAdapter(Context context) {
         mContext = context;
         mSelTest = id -> {
             throw new IllegalStateException(
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
similarity index 72%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java
copy to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
index c2d57f0..af40460 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
@@ -13,9 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.android.supportv7.widget.selection.single;
 
-import android.net.Uri;
 import android.view.MotionEvent;
 import android.view.View;
 
@@ -28,24 +27,22 @@
 /**
  * Access to details of an item associated with a {@link MotionEvent} instance.
  */
-final class FancyDetailsLookup extends ItemDetailsLookup<Uri> {
+final class DemoDetailsLookup extends ItemDetailsLookup<Long> {
 
     private final RecyclerView mRecView;
 
-    FancyDetailsLookup(RecyclerView view) {
+    DemoDetailsLookup(RecyclerView view) {
         mRecView = view;
     }
 
     @Override
-    public ItemDetails<Uri> getItemDetails(@NonNull MotionEvent e) {
+    public ItemDetails<Long> getItemDetails(@NonNull MotionEvent e) {
         @Nullable View view = mRecView.findChildViewUnder(e.getX(), e.getY());
         if (view != null) {
             ViewHolder holder = mRecView.getChildViewHolder(view);
-            if (holder instanceof FancyItemHolder) {
-                return ((FancyItemHolder) holder).getItemDetails();
+            if (holder instanceof DemoHolder) {
+                return ((DemoHolder) holder).getItemDetails();
             }
-            // FancyHeaderHolder doesn't hold a selectable item,
-            // so it doesn't support getItemDetails.
         }
         return null;
     }
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
similarity index 73%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java
copy to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
index 944e200..d92eef9 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
@@ -13,66 +13,55 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.android.supportv7.widget.selection.single;
 
 import android.graphics.Rect;
-import android.net.Uri;
 import android.view.MotionEvent;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.example.android.supportv7.R;
 
-final class FancyItemHolder extends FancyHolder {
+final class DemoHolder extends RecyclerView.ViewHolder {
 
     private final LinearLayout mContainer;
     private final TextView mSelector;
     private final TextView mLabel;
-    private final ItemDetails<Uri> mDetails;
+    private final ItemDetails<Long> mDetails;
 
-    private @Nullable Uri mKey;
-
-    FancyItemHolder(LinearLayout layout) {
+    DemoHolder(LinearLayout layout) {
         super(layout);
-
         mContainer = layout.findViewById(R.id.container);
         mSelector = layout.findViewById(R.id.selector);
         mLabel = layout.findViewById(R.id.label);
-        mDetails = new ItemDetails<Uri>() {
+        mDetails = new ItemDetails<Long>() {
             @Override
             public int getPosition() {
-                return FancyItemHolder.this.getBindingAdapterPosition();
+                return DemoHolder.this.getAbsoluteAdapterPosition();
             }
 
             @Override
-            public Uri getSelectionKey() {
-                return FancyItemHolder.this.mKey;
+            public Long getSelectionKey() {
+                return DemoHolder.this.getItemId();
             }
 
             @Override
             public boolean inDragRegion(@NonNull MotionEvent e) {
-                return FancyItemHolder.this.inDragRegion(e);
+                return DemoHolder.this.inDragRegion(e);
             }
 
             @Override
             public boolean inSelectionHotspot(@NonNull MotionEvent e) {
-                return FancyItemHolder.this.inSelectRegion(e);
-            }
-
-            @NonNull
-            @Override
-            public String toString() {
-                return FancyItemHolder.this.toString();
+                return DemoHolder.this.inSelectRegion(e);
             }
         };
     }
 
-    void update(Uri key, String label, boolean selected) {
-        mKey = key;
+    void update(String label, boolean selected) {
         mLabel.setText(label);
         setSelected(selected);
     }
@@ -112,12 +101,7 @@
         return iconRect.contains((int) e.getRawX(), (int) e.getRawY());
     }
 
-    ItemDetails<Uri> getItemDetails() {
+    ItemDetails<Long> getItemDetails() {
         return mDetails;
     }
-
-    @Override
-    public String toString() {
-        return "Item{name:" + mLabel.getText() + ", url:" + mKey + "}";
-    }
 }
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java
new file mode 100644
index 0000000..702768b
--- /dev/null
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.selection.single;
+
+import android.os.Bundle;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.selection.SelectionPredicates;
+import androidx.recyclerview.selection.SelectionTracker;
+import androidx.recyclerview.selection.SelectionTracker.SelectionObserver;
+import androidx.recyclerview.selection.StableIdKeyProvider;
+import androidx.recyclerview.selection.StorageStrategy;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.android.supportv7.R;
+
+/**
+ * RecyclerView Selection library single-selection mode demo activity.
+ */
+public class SingleStableIdSelectionDemoActivity extends AppCompatActivity {
+
+    private static final String TAG = "SelectionDemos";
+
+    private DemoAdapter mAdapter;
+    private SelectionTracker<Long> mSelectionTracker;
+    private GridLayoutManager mLayout;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.selection_demo_layout);
+        RecyclerView recView = findViewById(R.id.list);
+
+        mLayout = new GridLayoutManager(this, 1);
+        recView.setLayoutManager(mLayout);
+
+        mAdapter = new DemoAdapter(this);
+
+        // For StableIdKeyProvider (used below) to work correctly the adapter must
+        // have stable ids enabled.
+        mAdapter.setHasStableIds(true);
+
+        recView.setAdapter(mAdapter);
+
+        SelectionTracker.Builder<Long> builder = new SelectionTracker.Builder<>(
+                "single-stableid-demo",
+                recView,
+                new StableIdKeyProvider(recView),
+                new DemoDetailsLookup(recView),
+                StorageStrategy.createLongStorage());
+
+        mSelectionTracker = builder
+                // Can a single item.
+                .withSelectionPredicate(SelectionPredicates.createSelectSingleAnything())
+                .build();
+
+        // Lazily bind SelectionTracker. Allows us to defer initialization of the
+        // SelectionTracker dependency until after the adapter is created.
+        mAdapter.bindSelectionHelper(mSelectionTracker);
+
+        // TODO: Glue selection to ActionMode, since that'll be a common practice.
+        mSelectionTracker.addObserver(
+                new SelectionObserver<Long>() {
+                    @Override
+                    public void onSelectionChanged() {
+                        Log.i(TAG, "Selection changed to: " + mSelectionTracker.getSelection());
+                    }
+                });
+
+        // Restore selection from saved state.
+        updateFromSavedState(savedInstanceState);
+    }
+
+    @Override
+    protected void onSaveInstanceState(@NonNull Bundle state) {
+        super.onSaveInstanceState(state);
+        mSelectionTracker.onSaveInstanceState(state);
+    }
+
+    private void updateFromSavedState(Bundle state) {
+        mSelectionTracker.onRestoreInstanceState(state);
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (mSelectionTracker.clearSelection()) {
+            return;
+        } else {
+            super.onBackPressed();
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        mSelectionTracker.clearSelection();
+        super.onDestroy();
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mAdapter.loadData();
+    }
+}
diff --git a/samples/Support7Demos/src/main/res/values/strings.xml b/samples/Support7Demos/src/main/res/values/strings.xml
index e467c89..4411d75 100644
--- a/samples/Support7Demos/src/main/res/values/strings.xml
+++ b/samples/Support7Demos/src/main/res/values/strings.xml
@@ -269,6 +269,7 @@
     <string name="appcompat_vector_title">AppCompat/Integrations/AnimatedVectorDrawable</string>
     <string name="appcompat_animated_selector_title">AppCompat/Integrations/AnimatedStateListDrawable</string>
 
+    <string name="single_selection_demo_activity">RecyclerView-Selection: Single Select</string>
     <string name="simple_selection_demo_activity">RecyclerView Selection: Gesture Only</string>
     <string name="fancy_selection_demo_activity">RecyclerView Selection: Gesture and Pointer</string>
 
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/OnPositionedBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/OnPositionedBenchmark.kt
index db48874..1cc3fc9 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/OnPositionedBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/OnPositionedBenchmark.kt
@@ -16,20 +16,21 @@
 
 package androidx.compose.ui
 
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.ContentGravity
+import androidx.compose.foundation.layout.Stack
+import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
 import androidx.test.filters.LargeTest
 import androidx.ui.benchmark.ComposeBenchmarkRule
 import androidx.ui.benchmark.toggleStateBenchmarkLayout
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.ContentGravity
 import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.Stack
-import androidx.compose.foundation.layout.preferredSize
 import androidx.ui.test.ComposeTestCase
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -57,7 +58,7 @@
 
     @Composable
     override fun emitContent() {
-        val size = state { 200.dp }
+        val size = remember { mutableStateOf(200.dp) }
         this.state = size
         Stack {
             Box(Modifier.preferredSize(size.value), gravity = ContentGravity.Center) {
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/WithConstraintsBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/WithConstraintsBenchmark.kt
index 26f9a82..f881f47 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/WithConstraintsBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/WithConstraintsBenchmark.kt
@@ -16,25 +16,26 @@
 
 package androidx.compose.ui
 
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.ContentGravity
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.State
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
 import androidx.test.filters.LargeTest
 import androidx.ui.benchmark.ComposeBenchmarkRule
 import androidx.ui.benchmark.toggleStateBenchmarkComposeMeasureLayout
 import androidx.ui.benchmark.toggleStateBenchmarkMeasureLayout
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.ContentGravity
 import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.preferredSize
-import androidx.compose.ui.unit.Constraints
 import androidx.ui.test.ComposeTestCase
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.dp
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -69,7 +70,7 @@
 
     @Composable
     override fun emitContent() {
-        val size = state { 200.dp }
+        val size = remember { mutableStateOf(200.dp) }
         this.state = size
         Box(Modifier.preferredSize(300.dp), gravity = ContentGravity.Center) {
             Spacer(Modifier.preferredSize(width = size.value, height = size.value))
@@ -87,7 +88,7 @@
 
     @Composable
     override fun emitContent() {
-        val size = state { 200.dp }
+        val size = remember { mutableStateOf(200.dp) }
         this.state = size
         WithConstraints {
             Box(Modifier.preferredSize(300.dp), gravity = ContentGravity.Center) {
@@ -107,7 +108,7 @@
 
     @Composable
     override fun emitContent() {
-        val size = state { 100 }
+        val size = remember { mutableStateOf(100) }
         this.state = size
         ChangingConstraintsLayout(state) {
             WithConstraints {
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
index 96d2d67f..d4468a8 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
@@ -16,9 +16,17 @@
 
 package androidx.ui.benchmark.test
 
+import androidx.compose.foundation.layout.InnerPadding
+import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.offset
 import androidx.test.filters.LargeTest
 import androidx.ui.benchmark.ComposeBenchmarkRule
 import androidx.ui.benchmark.benchmarkDrawPerf
@@ -31,15 +39,8 @@
 import androidx.ui.benchmark.toggleStateBenchmarkLayout
 import androidx.ui.benchmark.toggleStateBenchmarkMeasure
 import androidx.ui.benchmark.toggleStateBenchmarkRecompose
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
 import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.InnerPadding
-import androidx.compose.foundation.layout.padding
 import androidx.ui.test.ComposeTestCase
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.offset
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -168,7 +169,7 @@
 
     @Composable
     override fun emitContent() {
-        val padding = state { 5.dp }
+        val padding = remember { mutableStateOf(5.dp) }
         paddingState = padding
 
         FillerContainer {
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/TrailingLambdaBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/TrailingLambdaBenchmark.kt
index 297b453..df185ec 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/TrailingLambdaBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/TrailingLambdaBenchmark.kt
@@ -16,20 +16,21 @@
 
 package androidx.ui.benchmark.test
 
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.preferredWidth
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
 import androidx.test.filters.LargeTest
 import androidx.ui.benchmark.ComposeBenchmarkRule
 import androidx.ui.benchmark.benchmarkFirstCompose
 import androidx.ui.benchmark.toggleStateBenchmarkRecompose
-import androidx.compose.ui.Modifier
-import androidx.compose.foundation.Box
 import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.preferredWidth
 import androidx.ui.test.ComposeTestCase
-import androidx.compose.ui.unit.dp
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -69,7 +70,7 @@
 
     @Composable
     override fun emitContent() {
-        val number = state { 5 }
+        val number = remember { mutableStateOf(5) }
         numberState = number
 
         val content = @Composable {
diff --git a/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt b/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
index c5f386d..e24325c 100644
--- a/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
+++ b/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
@@ -24,14 +24,13 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.runtime.staticAmbientOf
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.graphics.Color
 import androidx.test.filters.MediumTest
-import androidx.ui.test.assertNoPendingChanges
 import androidx.ui.test.ComposeTestCase
 import androidx.ui.test.ExperimentalTesting
+import androidx.ui.test.assertNoPendingChanges
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.doFramesUntilNoChangesPending
 import org.junit.Assert
@@ -109,7 +108,7 @@
 
     @Composable
     override fun emitContent() {
-        val primary = state { Color.Red }
+        val primary = remember { mutableStateOf(Color.Red) }
         primaryState = primary
 
         val palette = createTheme(primary.value)
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/BaseSimpleRadioButtonTestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/BaseSimpleRadioButtonTestCase.kt
index 6611f3b..460c749 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/BaseSimpleRadioButtonTestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/BaseSimpleRadioButtonTestCase.kt
@@ -18,11 +18,12 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
-import androidx.ui.test.ComposeTestCase
 import androidx.ui.integration.test.ToggleableTestCase
+import androidx.ui.test.ComposeTestCase
 
 abstract class BaseSimpleRadioButtonTestCase : ComposeTestCase, ToggleableTestCase {
 
@@ -30,7 +31,7 @@
 
     @Composable
     fun getInnerSize(): MutableState<Dp> {
-        val innerSize = state { 10.dp }
+        val innerSize = remember { mutableStateOf(10.dp) }
         state = innerSize
         return innerSize
     }
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/RectsInColumnTestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/RectsInColumnTestCase.kt
index fa02d42..97395cb 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/RectsInColumnTestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/RectsInColumnTestCase.kt
@@ -16,20 +16,21 @@
 
 package androidx.ui.integration.test.foundation
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.background
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Surface
-import androidx.ui.test.ComposeTestCase
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
 import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.preferredSize
+import androidx.ui.test.ComposeTestCase
 
 /**
  * Test case that puts the given amount of rectangles into a column layout and makes changes by
@@ -67,7 +68,7 @@
 
     @Composable
     fun ColoredRectWithModel() {
-        val state = state { Color.Black }
+        val state = remember { mutableStateOf(Color.Black) }
         states.add(state)
         Box(Modifier.preferredSize(100.dp, 50.dp).background(color = state.value))
     }
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
index b5bc75e..34ae215 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
@@ -16,19 +16,20 @@
 
 package androidx.ui.integration.test.material
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Text
-import androidx.ui.integration.test.ToggleableTestCase
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.material.Checkbox
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Surface
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.ui.integration.test.ToggleableTestCase
 import androidx.ui.test.ComposeTestCase
 
 /**
@@ -66,7 +67,7 @@
 
     @Composable
     fun CheckboxWithState(modifier: Modifier = Modifier) {
-        val state = state { false }
+        val state = remember { mutableStateOf(false) }
         states.add(state)
         Checkbox(
             checked = state.value,
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComplexInteractions.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComplexInteractions.kt
index 77b8b91..8b84ced 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComplexInteractions.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComplexInteractions.kt
@@ -20,26 +20,27 @@
 import android.view.ViewGroup.LayoutParams.MATCH_PARENT
 import android.widget.FrameLayout
 import android.widget.RelativeLayout
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Recomposer
 import androidx.compose.foundation.Box
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.setContent
-import androidx.ui.demos.common.ComposableDemo
-import androidx.ui.demos.common.DemoCategory
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.material.Button
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.ContextAmbient
+import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
+import androidx.ui.demos.common.ComposableDemo
+import androidx.ui.demos.common.DemoCategory
 
 // TODO(b/158099918): Add this demo to AndroidViewDemos.kt once b/158099918 has been resolved.
 @Suppress("unused")
@@ -105,7 +106,7 @@
 
 @Composable
 fun colorButton() {
-    val state = state { false }
+    val state = remember { mutableStateOf(false) }
     val color =
         if (state.value) {
             Color.Red
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
index 0519f73..f32522d 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
@@ -20,16 +20,10 @@
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import androidx.compose.runtime.Composable
-import androidx.ui.androidview.adapters.setOnClick
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.ScrollableRow
 import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
@@ -38,13 +32,20 @@
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.ui.input.pointer.pointerInteropFilter
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.ui.androidview.adapters.setOnClick
 import androidx.ui.demos.common.ComposableDemo
 import androidx.ui.demos.common.DemoCategory
-import androidx.compose.ui.viewinterop.AndroidView
 
 val AndroidInComposeDemos = DemoCategory("Android In Compose Interop", listOf(
     ComposableDemo("4 Android tap in Compose") { FourAndroidTapInCompose() },
@@ -276,7 +277,7 @@
 @Composable
 private fun PointerInteropFilterDemo() {
 
-    val motionEventString: MutableState<String> = state { "Touch here!" }
+    val motionEventString: MutableState<String> = remember { mutableStateOf("Touch here!") }
 
     Column {
         Text("Demonstrates the functionality of pointerInteropFilter.")
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt
index 3b8934c..3a3602f 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt
@@ -22,23 +22,11 @@
 import android.view.ViewGroup
 import android.widget.TextView
 import androidx.activity.ComponentActivity
-import androidx.compose.runtime.Composition
-import androidx.compose.runtime.Recomposer
-import androidx.compose.runtime.state
-import androidx.ui.androidview.adapters.setOnClick
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
-import androidx.compose.ui.platform.setContent
-import androidx.ui.demos.common.ActivityDemo
-import androidx.ui.demos.common.DemoCategory
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.ScrollableRow
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
-import androidx.compose.ui.graphics.toArgb
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
@@ -48,7 +36,20 @@
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.preferredWidth
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composition
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.unit.dp
+import androidx.ui.androidview.adapters.setOnClick
+import androidx.ui.demos.common.ActivityDemo
+import androidx.ui.demos.common.DemoCategory
 
 val ComposeInAndroidDemos = DemoCategory(
     "Compose in Android Interop", listOf(
@@ -150,7 +151,7 @@
 
         composition = container.setContent(Recomposer.current()) {
 
-            val currentColor = state { Color.LightGray }
+            val currentColor = remember { mutableStateOf(Color.LightGray) }
 
             val tap =
                 Modifier.tapGestureFilter {
@@ -196,7 +197,7 @@
         val container = findViewById<ViewGroup>(R.id.container)
         composition = container.setContent(Recomposer.current()) {
 
-            val currentColor = state { Color.LightGray }
+            val currentColor = remember { mutableStateOf(Color.LightGray) }
 
             Box(
                 Modifier
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/WebComponentActivity.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/WebComponentActivity.kt
index 8aae896..12bf7cc 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/WebComponentActivity.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/WebComponentActivity.kt
@@ -31,23 +31,22 @@
 import android.widget.FrameLayout
 import android.widget.LinearLayout
 import androidx.activity.ComponentActivity
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.platform.setContent
+import androidx.compose.ui.viewinterop.emitView
+import androidx.ui.androidview.WebComponent
+import androidx.ui.androidview.WebContext
 import androidx.ui.androidview.adapters.dp
 import androidx.ui.androidview.adapters.setControlledText
 import androidx.ui.androidview.adapters.setLayoutHeight
 import androidx.ui.androidview.adapters.setLayoutWeight
 import androidx.ui.androidview.adapters.setLayoutWidth
-import androidx.ui.androidview.adapters.setOnClick
 import androidx.ui.androidview.adapters.setOnTextChanged
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Stable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.platform.setContent
-import androidx.ui.androidview.WebComponent
-import androidx.ui.androidview.WebContext
-import androidx.compose.ui.viewinterop.emitView
 
 @Stable
 class WebParams {
@@ -87,7 +86,7 @@
         Log.d("WebCompAct", "renderViews")
     }
 
-    val displayedUrl = state { "https://www.google.com" }
+    val displayedUrl = remember { mutableStateOf("https://www.google.com") }
 
     fun updateDisplayedUrl(newValue: String?) {
         if (!newValue.isNullOrBlank() && newValue != displayedUrl.value) {
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/CrossfadeDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/CrossfadeDemo.kt
index dd62046..fd214c8 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/CrossfadeDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/CrossfadeDemo.kt
@@ -17,26 +17,26 @@
 package androidx.compose.animation.demos
 
 import android.util.Log
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.animation.Crossfade
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.foundation.Box
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 import kotlin.random.Random
 
 @Composable
 fun CrossfadeDemo() {
-    var current by state { tabs[0] }
+    var current by remember { mutableStateOf(tabs[0]) }
     Column {
         Row {
             tabs.forEach { tab ->
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/FancyScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/FancyScrollingDemo.kt
index 64527aa..2587b79 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/FancyScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/FancyScrollingDemo.kt
@@ -17,25 +17,26 @@
 package androidx.compose.animation.demos
 
 import android.util.Log
+import androidx.compose.animation.animatedFloat
 import androidx.compose.animation.core.SpringSpec
 import androidx.compose.animation.core.TargetAnimation
 import androidx.compose.animation.core.fling
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.animation.animatedFloat
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
 import androidx.compose.foundation.Canvas
 import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.rawDragGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import kotlin.math.roundToInt
@@ -51,7 +52,7 @@
             modifier = Modifier.padding(40.dp)
         )
         val animScroll = animatedFloat(0f)
-        val itemWidth = state { 0f }
+        val itemWidth = remember { mutableStateOf(0f) }
         val gesture = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
             override fun onDrag(dragDistance: Offset): Offset {
                 // Snap to new drag position
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/GestureBasedAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/GestureBasedAnimationDemo.kt
index e15f667..0d63697 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/GestureBasedAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/GestureBasedAnimationDemo.kt
@@ -16,20 +16,21 @@
 
 package androidx.compose.animation.demos
 
+import androidx.compose.animation.ColorPropKey
 import androidx.compose.animation.core.FloatPropKey
 import androidx.compose.animation.core.spring
 import androidx.compose.animation.core.transitionDefinition
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.animation.ColorPropKey
 import androidx.compose.animation.transition
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.ui.graphics.Color
-import androidx.compose.foundation.layout.fillMaxSize
 
 private const val halfSize = 200f
 
@@ -59,7 +60,7 @@
 
 @Composable
 fun GestureBasedAnimationDemo() {
-    val toState = state { ComponentState.Released }
+    val toState = remember { mutableStateOf(ComponentState.Released) }
     val pressIndicator =
         Modifier.pressIndicatorGestureFilter(
             onStart = { toState.value = ComponentState.Pressed },
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/MultiDimensionalAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/MultiDimensionalAnimationDemo.kt
index f44e382..a54d5b7 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/MultiDimensionalAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/MultiDimensionalAnimationDemo.kt
@@ -16,28 +16,27 @@
 
 package androidx.compose.animation.demos
 
+import androidx.compose.animation.ColorPropKey
+import androidx.compose.animation.RectPropKey
 import androidx.compose.animation.core.spring
 import androidx.compose.animation.core.transitionDefinition
 import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
-import androidx.compose.runtime.structuralEqualityPolicy
-import androidx.compose.animation.ColorPropKey
-import androidx.compose.animation.RectPropKey
 import androidx.compose.animation.transition
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Canvas
 import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
-import androidx.compose.foundation.layout.fillMaxSize
 
 @Composable
 fun MultiDimensionalAnimationDemo() {
-    val currentState = state { AnimState.Collapsed }
+    val currentState = remember { mutableStateOf(AnimState.Collapsed) }
     val onClick = {
         // Cycle through states when clicked.
         currentState.value = when (currentState.value) {
@@ -47,8 +46,8 @@
         }
     }
 
-    val width = state(policy = structuralEqualityPolicy()) { 0f }
-    val height = state(policy = structuralEqualityPolicy()) { 0f }
+    val width = remember { mutableStateOf(0f) }
+    val height = remember { mutableStateOf(0f) }
     val state = transition(
         definition = remember(width.value, height.value) {
             createTransDef(width.value, height.value)
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/RepeatedRotationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/RepeatedRotationDemo.kt
index 8798c14..8e0f618 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/RepeatedRotationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/RepeatedRotationDemo.kt
@@ -21,28 +21,29 @@
 import androidx.compose.animation.core.repeatable
 import androidx.compose.animation.core.transitionDefinition
 import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
 import androidx.compose.animation.transition
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.foundation.Canvas
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.rotate
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.rotate
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 
 @Composable
 fun RepeatedRotationDemo() {
-    val state = state { RotationStates.Original }
+    val state = remember { mutableStateOf(RotationStates.Original) }
     Column(
         Modifier.fillMaxSize()
             .wrapContentSize(Alignment.Center),
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SingleValueAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SingleValueAnimationDemo.kt
index f2a34ea..6b39349 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SingleValueAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SingleValueAnimationDemo.kt
@@ -16,18 +16,19 @@
 
 package androidx.compose.animation.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
 import androidx.compose.animation.animate
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.clickable
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 
 @Composable
 fun SingleValueAnimationDemo() {
-    val enabled = state { true }
+    val enabled = remember { mutableStateOf(true) }
     val color = animate(if (enabled.value) Color.Green else Color.Red)
     Box(
         Modifier.fillMaxSize().clickable { enabled.value = !enabled.value },
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringBackScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringBackScrollingDemo.kt
index 9fa38f3..1b55e5b 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringBackScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringBackScrollingDemo.kt
@@ -17,25 +17,26 @@
 package androidx.compose.animation.demos
 
 import android.util.Log
+import androidx.compose.animation.animatedFloat
 import androidx.compose.animation.core.SpringSpec
 import androidx.compose.animation.core.fling
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.animation.animatedFloat
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
 import androidx.compose.foundation.Canvas
 import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.rawDragGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import kotlin.math.roundToInt
@@ -49,8 +50,8 @@
             modifier = Modifier.padding(40.dp)
         )
         val animScroll = animatedFloat(0f)
-        val itemWidth = state { 0f }
-        val isFlinging = state { false }
+        val itemWidth = remember { mutableStateOf(0f) }
+        val isFlinging = remember { mutableStateOf(false) }
         val gesture = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
             override fun onDrag(dragDistance: Offset): Offset {
                 animScroll.snapTo(animScroll.targetValue + dragDistance.x)
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/StateBasedRippleDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/StateBasedRippleDemo.kt
index 3748499..3b0531e 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/StateBasedRippleDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/StateBasedRippleDemo.kt
@@ -24,18 +24,18 @@
 import androidx.compose.animation.core.keyframes
 import androidx.compose.animation.core.transitionDefinition
 import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
 import androidx.compose.animation.transition
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Canvas
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.pressIndicatorGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.unit.dp
 
 @Composable
@@ -48,7 +48,7 @@
 @Composable
 private fun RippleRect() {
     val radius = with(DensityAmbient.current) { TargetRadius.toPx() }
-    val toState = state { ButtonStatus.Initial }
+    val toState = remember { mutableStateOf(ButtonStatus.Initial) }
     val rippleTransDef = remember { createTransDef(radius) }
     val onPress: (Offset) -> Unit = { position ->
         down.x = position.x
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SwipeToDismissDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SwipeToDismissDemo.kt
index c09612b..0753ed2 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SwipeToDismissDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SwipeToDismissDemo.kt
@@ -16,30 +16,31 @@
 
 package androidx.compose.animation.demos
 
+import androidx.compose.animation.animatedFloat
 import androidx.compose.animation.core.AnimationEndReason
 import androidx.compose.animation.core.ExponentialDecay
 import androidx.compose.animation.core.FastOutSlowInEasing
 import androidx.compose.animation.core.SpringSpec
 import androidx.compose.animation.core.TargetAnimation
 import androidx.compose.animation.core.fling
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.animation.animatedFloat
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
-import androidx.compose.ui.onPositioned
 import androidx.compose.foundation.Canvas
 import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.rawDragGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.DrawScope
+import androidx.compose.ui.onPositioned
+import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import kotlin.math.sign
@@ -63,9 +64,9 @@
 @Composable
 private fun SwipeToDismiss() {
     val itemBottom = animatedFloat(height)
-    val index = state { 0 }
-    val itemWidth = state { 0f }
-    val isFlinging = state { false }
+    val index = remember { mutableStateOf(0) }
+    val itemWidth = remember { mutableStateOf(0f) }
+    val isFlinging = remember { mutableStateOf(false) }
     val modifier = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
         override fun onStart(downPosition: Offset) {
             itemBottom.setBounds(0f, height)
diff --git a/ui/ui-animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt b/ui/ui-animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
index 29de2dd..51b7e0d 100644
--- a/ui/ui-animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
+++ b/ui/ui-animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
@@ -17,13 +17,13 @@
 
 import androidx.compose.animation.core.AnimationConstants.DefaultDurationMillis
 import androidx.compose.animation.core.TweenSpec
+import androidx.compose.foundation.Text
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.onDispose
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.test.filters.MediumTest
-import androidx.compose.foundation.Text
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.onNodeWithText
 import androidx.ui.test.runOnIdle
@@ -46,7 +46,7 @@
         composeTestRule.clockTestRule.pauseClock()
 
         composeTestRule.setContent {
-            val showFirst by state { true }
+            val showFirst by remember { mutableStateOf(true) }
             Crossfade(showFirst) {
                 Text(if (it) First else Second)
             }
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
index 4a1aeca..2e01354 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.ui.demos
 
-import androidx.compose.runtime.Composable
 import androidx.compose.foundation.BaseTextField
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentGravity
@@ -36,21 +35,23 @@
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.preferredWidth
 import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.runtime.state
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.window.Popup
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Popup
 
 @Composable
 fun PopupDemo() {
-    val exampleIndex = state { 0 }
+    val exampleIndex = remember { mutableStateOf(0) }
     val totalExamples = 8
 
     Column {
@@ -127,7 +128,7 @@
 
 @Composable
 private fun ColumnScope.PopupToggle() {
-    val showPopup = state { true }
+    val showPopup = remember { mutableStateOf(true) }
 
     Column(Modifier.gravity(Alignment.CenterHorizontally)) {
         Box(Modifier.preferredSize(100.dp)) {
@@ -163,9 +164,9 @@
     Column(Modifier.gravity(Alignment.CenterHorizontally)) {
         val heightSize = 120.dp
         val widthSize = 160.dp
-        val popupContentState = state { 0 }
+        val popupContentState = remember { mutableStateOf(0) }
         val totalContentExamples = 2
-        val popupCounter = state { 0 }
+        val popupCounter = remember { mutableStateOf(0) }
 
         Box(Modifier.preferredSize(widthSize, heightSize), backgroundColor = Color.Gray) {
             Popup(Alignment.Center) {
@@ -201,10 +202,10 @@
 private fun ColumnScope.PopupWithChangingParent() {
     val containerWidth = 400.dp
     val containerHeight = 200.dp
-    val parentGravity = state { ContentGravity.TopStart }
-    val parentWidth = state { 80.dp }
-    val parentHeight = state { 60.dp }
-    val parentSizeChanged = state { false }
+    val parentGravity = remember { mutableStateOf(ContentGravity.TopStart) }
+    val parentWidth = remember { mutableStateOf(80.dp) }
+    val parentHeight = remember { mutableStateOf(60.dp) }
+    val parentSizeChanged = remember { mutableStateOf(false) }
 
     Column(Modifier.gravity(Alignment.CenterHorizontally)) {
         Box(
@@ -255,8 +256,8 @@
     Column(Modifier.gravity(Alignment.CenterHorizontally)) {
         val heightSize = 200.dp
         val widthSize = 400.dp
-        val counter = state { 0 }
-        val popupAlignment = state { Alignment.TopStart }
+        val counter = remember { mutableStateOf(0) }
+        val popupAlignment = remember { mutableStateOf(Alignment.TopStart) }
         Box(
             modifier = Modifier.preferredSize(widthSize, heightSize),
             backgroundColor = Color.Red,
@@ -299,11 +300,11 @@
         val widthSize = 190.dp
         val heightSize = 120.dp
         val editLineSize = 150.dp
-        val showEmail = state {
-            "Enter your email in the white rectangle and click outside"
+        val showEmail = remember {
+            mutableStateOf("Enter your email in the white rectangle and click outside")
         }
-        val email = state { "email" }
-        val showPopup = state { true }
+        val email = remember { mutableStateOf("email") }
+        val showPopup = remember { mutableStateOf(true) }
 
         Text(text = showEmail.value)
 
@@ -338,10 +339,10 @@
 @Composable
 private fun ColumnScope.PopupWithChangingSize() {
     Column(Modifier.gravity(Alignment.CenterHorizontally)) {
-        val showPopup = state { true }
+        val showPopup = remember { mutableStateOf(true) }
         val heightSize = 120.dp
         val widthSize = 160.dp
-        val rectangleState = state { 0 }
+        val rectangleState = remember { mutableStateOf(0) }
 
         Spacer(Modifier.preferredHeight(15.dp))
         Box(
@@ -447,7 +448,7 @@
     initialText: String = "",
     color: Color = Color.White
 ) {
-    val state = state { TextFieldValue(initialText) }
+    val state = remember { mutableStateOf(TextFieldValue(initialText)) }
     BaseTextField(
         value = state.value,
         modifier = modifier.background(color = color),
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
index 2f11fdc..9785349 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
@@ -26,7 +26,8 @@
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.material.MaterialTheme
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.autofill.AutofillNode
 import androidx.compose.ui.autofill.AutofillType
@@ -45,8 +46,8 @@
 @OptIn(ExperimentalFoundationApi::class)
 fun ExplicitAutofillTypesDemo() {
     Column {
-        val nameState = state { TextFieldValue("Enter name here") }
-        val emailState = state { TextFieldValue("Enter email here") }
+        val nameState = remember { mutableStateOf(TextFieldValue("Enter name here")) }
+        val emailState = remember { mutableStateOf(TextFieldValue("Enter email here")) }
         val autofill = AutofillAmbient.current
         val labelStyle = MaterialTheme.typography.subtitle1
         val textStyle = MaterialTheme.typography.h6
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
index 84c6c6b..6eed404 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
@@ -15,26 +15,27 @@
  */
 package androidx.compose.ui.demos.focus
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.ExperimentalFocus
-import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color.Companion.Black
-import androidx.compose.ui.graphics.Color.Companion.Green
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus
+import androidx.compose.ui.focus.ExperimentalFocus
+import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.isFocused
 import androidx.compose.ui.focusObserver
 import androidx.compose.ui.focusRequester
 import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color.Companion.Black
+import androidx.compose.ui.graphics.Color.Companion.Green
 
 @Composable
 fun FocusableDemo() {
@@ -59,7 +60,7 @@
 @Composable
 @OptIn(ExperimentalFocus::class)
 private fun FocusableText(text: String) {
-    var color by state { Black }
+    var color by remember { mutableStateOf(Black) }
     val focusRequester = FocusRequester()
     Text(
         modifier = Modifier
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusRequester.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusRequester.kt
index b13455f..b6d5d576 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusRequester.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusRequester.kt
@@ -25,19 +25,20 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.focus.ExperimentalFocus
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.isFocused
 import androidx.compose.ui.focusObserver
 import androidx.compose.ui.focusRequester
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
 
 private const val size = 200f
 private enum class CurrentShape { Circle, Square }
@@ -56,7 +57,7 @@
         // Shared focus requester.
         val focusRequester = FocusRequester()
 
-        var shape by state { CurrentShape.Square }
+        var shape by remember { mutableStateOf(CurrentShape.Square) }
         when (shape) {
             CurrentShape.Circle -> Circle(
                 modifier = Modifier
@@ -77,7 +78,7 @@
 @Composable
 @OptIn(ExperimentalFocus::class)
 private fun Circle(modifier: Modifier = Modifier, nextShape: () -> Unit) {
-    var isFocused by state { false }
+    var isFocused by remember { mutableStateOf(false) }
     val scale = animate(if (isFocused) 0f else 1f, TweenSpec(2000)) {
         if (it == 0f) {
             nextShape()
@@ -101,7 +102,7 @@
 @Composable
 @OptIn(ExperimentalFocus::class)
 private fun Square(modifier: Modifier = Modifier, nextShape: () -> Unit) {
-    var isFocused by state { false }
+    var isFocused by remember { mutableStateOf(false) }
     val scale = animate(if (isFocused) 0f else 1f, TweenSpec(2000)) {
         if (it == 0f) {
             nextShape()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
index 2d27818..2e0f855 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
@@ -16,11 +16,6 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.doubleTapGestureFilter
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
@@ -29,7 +24,13 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.doubleTapGestureFilter
 import androidx.compose.ui.unit.dp
 
 /**
@@ -37,7 +38,7 @@
  */
 @Composable
 fun DoubleTapGestureFilterDemo() {
-    val color = state { Colors.random() }
+    val color = remember { mutableStateOf(Colors.random()) }
 
     val onDoubleTap: (Offset) -> Unit = {
         color.value = color.value.anotherRandomColor()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
index 27f8afe..7eef9bc 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
@@ -16,30 +16,31 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.doubleTapGestureFilter
 import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.unit.dp
 
 @Composable
 fun DoubleTapInTapDemo() {
     val defaultColor = Grey
 
-    val innerColor = state { defaultColor }
-    val outerColor = state { defaultColor }
+    val innerColor = remember { mutableStateOf(defaultColor) }
+    val outerColor = remember { mutableStateOf(defaultColor) }
 
     val onTap: (Offset) -> Unit = {
         outerColor.value = outerColor.value.next()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
index 2bb6bb7..75f0f7c 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
@@ -16,14 +16,6 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.ScaleObserver
-import androidx.compose.ui.gesture.dragGestureFilter
-import androidx.compose.ui.gesture.scaleGestureFilter
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.layout.Column
@@ -31,7 +23,16 @@
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.ScaleObserver
+import androidx.compose.ui.gesture.dragGestureFilter
+import androidx.compose.ui.gesture.scaleGestureFilter
 import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.unit.dp
@@ -42,9 +43,9 @@
  */
 @Composable
 fun DragAndScaleGestureFilterDemo() {
-    val size = state { 200.dp }
-    val offset = state { Offset.Zero }
-    val dragInScale = state { false }
+    val size = remember { mutableStateOf(200.dp) }
+    val offset = remember { mutableStateOf(Offset.Zero) }
+    val dragInScale = remember { mutableStateOf(false) }
 
     val scaleObserver = object : ScaleObserver {
         override fun onScale(scaleFactor: Float) {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
index f2a0c4e..e286fdc 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
@@ -16,19 +16,20 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.dragSlopExceededGestureFilter
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.dragSlopExceededGestureFilter
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 
 /**
@@ -40,7 +41,7 @@
     val verticalColor = Color(0xfff44336)
     val horizontalColor = Color(0xff2196f3)
 
-    val orientationVertical = state { true }
+    val orientationVertical = remember { mutableStateOf(true) }
 
     // This would be more efficient if onTouchSlopExceeded were memoized because it's
     // value doesn't need to change for each new composition.  Like this, every time
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
index d6ebdd3..05fe809 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
@@ -16,31 +16,32 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.ContentDrawScope
-import androidx.compose.ui.DrawModifier
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.ContentDrawScope
+import androidx.compose.ui.DrawModifier
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.ScrollCallback
 import androidx.compose.ui.gesture.doubleTapGestureFilter
 import androidx.compose.ui.gesture.longPressGestureFilter
 import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.ui.gesture.scrollGestureFilter
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.clipRect
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
@@ -81,8 +82,8 @@
 @Composable
 private fun Scrollable(orientation: Orientation, children: @Composable () -> Unit) {
     val maxOffset = 0f
-    val offset = state { maxOffset }
-    val minOffset = state { 0f }
+    val offset = remember { mutableStateOf(maxOffset) }
+    val minOffset = remember { mutableStateOf(0f) }
 
     val scrollObserver = object : ScrollCallback {
         override fun onScroll(scrollDistance: Float): Float {
@@ -183,8 +184,8 @@
     val pressedColor = PressedColor
     val defaultColor = Red
 
-    val color = state { defaultColor }
-    val showPressed = state { false }
+    val color = remember { mutableStateOf(defaultColor) }
+    val showPressed = remember { mutableStateOf(false) }
 
     val onPress: (Offset) -> Unit = {
         showPressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
index b2148fe..1853323 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
@@ -16,12 +16,6 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.longPressDragGestureFilter
-import androidx.compose.ui.gesture.LongPressDragObserver
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.layout.Column
@@ -29,7 +23,14 @@
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.LongPressDragObserver
+import androidx.compose.ui.gesture.longPressDragGestureFilter
 import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.unit.dp
 
@@ -39,8 +40,8 @@
 @Composable
 fun LongPressDragGestureFilterDemo() {
 
-    val offset = state { Offset.Zero }
-    val color = state { Grey }
+    val offset = remember { mutableStateOf(Offset.Zero) }
+    val color = remember { mutableStateOf(Grey) }
 
     val longPressDragObserver =
         object : LongPressDragObserver {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
index 8bb8395..ebcefca 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
@@ -16,11 +16,6 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.longPressGestureFilter
 import androidx.compose.foundation.Border
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
@@ -28,7 +23,13 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.longPressGestureFilter
 import androidx.compose.ui.unit.dp
 
 /**
@@ -36,7 +37,7 @@
  */
 @Composable
 fun LongPressGestureDetectorDemo() {
-    val color = state { Colors.random() }
+    val color = remember { mutableStateOf(Colors.random()) }
 
     val onLongPress = { _: Offset ->
         color.value = color.value.anotherRandomColor()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
index e6c9ffe..08a3fcc 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
@@ -16,19 +16,20 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Border
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentGravity
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.longPressGestureFilter
+import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.unit.dp
 
 /**
@@ -62,8 +63,8 @@
     val defaultColor = DefaultBackgroundColor
     val pressedColor = PressedColor
 
-    val currentColor = state { defaultColor }
-    val pressed = state { false }
+    val currentColor = remember { mutableStateOf(defaultColor) }
+    val pressed = remember { mutableStateOf(false) }
 
     val onLongPress: (Offset) -> Unit = {
         currentColor.value = currentColor.value.next()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
index 06a6648..32f3969 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
@@ -16,21 +16,22 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Border
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.doubleTapGestureFilter
 import androidx.compose.ui.gesture.longPressGestureFilter
 import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.unit.dp
 
 /**
@@ -65,8 +66,8 @@
     val defaultColor = DefaultBackgroundColor
     val pressedColor = PressedColor
 
-    val currentColor = state { defaultColor }
-    val pressed = state { false }
+    val currentColor = remember { mutableStateOf(defaultColor) }
+    val pressed = remember { mutableStateOf(false) }
 
     val onStart: (Any) -> Unit = {
         pressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScalingDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScalingDemo.kt
index a879e06..bdbed74 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScalingDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScalingDemo.kt
@@ -16,18 +16,19 @@
 
 package androidx.compose.ui.demos.gestures
 
+import androidx.compose.foundation.Text
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Layout
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.gesture.RawScaleObserver
-import androidx.compose.foundation.Text
-import androidx.compose.foundation.background
-import androidx.compose.ui.graphics.Color
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.ui.gesture.rawScaleGestureFilter
+import androidx.compose.ui.graphics.Color
 import kotlin.math.roundToInt
 
 /**
@@ -66,7 +67,7 @@
     children: @Composable () -> Unit
 ) {
 
-    val currentPercent = state { 1f }
+    val currentPercent = remember { mutableStateOf(1f) }
 
     val outerScaleObserver = object : RawScaleObserver {
         override fun onScale(scaleFactor: Float): Float {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
index 0e24910..243ff16 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
@@ -16,30 +16,31 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.foundation.Border
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clipToBounds
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.ScrollCallback
 import androidx.compose.ui.gesture.doubleTapGestureFilter
 import androidx.compose.ui.gesture.longPressGestureFilter
 import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.ui.gesture.scrollGestureFilter
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
@@ -76,8 +77,8 @@
  */
 @Composable
 private fun Scrollable(children: @Composable () -> Unit) {
-    val offset = state { 0f }
-    val maxOffset = state { 0f }
+    val offset = remember { mutableStateOf(0f) }
+    val maxOffset = remember { mutableStateOf(0f) }
 
     val scrollObserver = object : ScrollCallback {
         override fun onScroll(scrollDistance: Float): Float {
@@ -136,8 +137,8 @@
     val pressedColor = PressedColor
     val defaultColor = DefaultBackgroundColor
 
-    val color = state { defaultColor }
-    val showPressed = state { false }
+    val color = remember { mutableStateOf(defaultColor) }
+    val showPressed = remember { mutableStateOf(false) }
 
     val onPress: (Offset) -> Unit = {
         showPressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
index ecfdd804..42cb0c7 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
@@ -16,24 +16,24 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.composed
-import androidx.compose.ui.input.pointer.PointerInputFilter
-import androidx.compose.ui.input.pointer.PointerInputModifier
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.lazy.LazyColumnFor
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.PointerInputFilter
+import androidx.compose.ui.input.pointer.PointerInputModifier
 import androidx.compose.ui.platform.PointerEventPass
 import androidx.compose.ui.platform.PointerInputChange
 import androidx.compose.ui.platform.changedToDownIgnoreConsumed
@@ -68,7 +68,7 @@
                 .size(200.dp)
                 .background(color = Color.White)
         ) {
-            val pointerCount = state { 0 }
+            val pointerCount = remember { mutableStateOf(0) }
 
             Box(
                 Modifier.fillParentMaxSize()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
index babbc3a8..8ba9771 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
@@ -16,33 +16,31 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentGravity
 import androidx.compose.foundation.Text
-import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Stack
 import androidx.compose.foundation.layout.preferredSize
-import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.DragObserver
 import androidx.compose.ui.gesture.dragGestureFilter
-import androidx.compose.ui.window.Popup
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.round
+import androidx.compose.ui.window.Popup
 
 @Composable
 fun PopupDragDemo() {
     // TODO fix this demo in RTL (check when draggable handles RTL)
-    val offset = state {
-        Offset.Zero
-    }
+    val offset = remember { mutableStateOf(Offset.Zero) }
 
     val observer = remember {
         object : DragObserver {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
index 5f8dc47..0597cb7 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
@@ -16,20 +16,21 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.foundation.Border
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.pressIndicatorGestureFilter
+import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.unit.dp
 
 /**
@@ -37,7 +38,7 @@
  */
 @Composable
 fun PressIndicatorGestureFilterDemo() {
-    val pressed = state { false }
+    val pressed = remember { mutableStateOf(false) }
 
     val onStart: (Offset) -> Unit = {
         pressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
index 73b5b01..ec02bc0 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
@@ -16,12 +16,6 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.layout.Column
@@ -29,7 +23,14 @@
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.rawDragGestureFilter
 import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.unit.dp
 
@@ -38,7 +39,7 @@
  */
 @Composable
 fun RawDragGestureFilterDemo() {
-    val offset = state { Offset.Zero }
+    val offset = remember { mutableStateOf(Offset.Zero) }
 
     val dragObserver = object : DragObserver {
         override fun onDrag(dragDistance: Offset): Offset {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
index 0335ed4..a50cc3f 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
@@ -16,19 +16,20 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScaleObserver
-import androidx.compose.ui.gesture.scaleGestureFilter
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.ScaleObserver
+import androidx.compose.ui.gesture.scaleGestureFilter
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 
 /**
@@ -36,7 +37,7 @@
  */
 @Composable
 fun ScaleGestureFilterDemo() {
-    val size = state { 192.dp }
+    val size = remember { mutableStateOf(192.dp) }
 
     val scaleObserver = object : ScaleObserver {
         override fun onScale(scaleFactor: Float) {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
index fe9ce75..aa3dfec5 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
@@ -16,23 +16,24 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.emptyContent
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.emptyContent
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.ScrollCallback
 import androidx.compose.ui.gesture.scrollGestureFilter
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
@@ -66,8 +67,8 @@
     children: @Composable () -> Unit = emptyContent()
 ) {
 
-    val color = state { idleColor }
-    val offsetPx = state { 0f }
+    val color = remember { mutableStateOf(idleColor) }
+    val offsetPx = remember { mutableStateOf(0f) }
 
     val offsetDp = with(DensityAmbient.current) {
         offsetPx.value.toDp()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
index 8947f72..d9f499c 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
@@ -16,11 +16,6 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.foundation.Border
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
@@ -28,8 +23,14 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.ui.unit.dp
 
 /**
@@ -37,7 +38,7 @@
  */
 @Composable
 fun TapGestureFilterDemo() {
-    val color = state { Colors.random() }
+    val color = remember { mutableStateOf(Colors.random()) }
 
     val onTap: (Offset) -> Unit = {
         color.value = color.value.anotherRandomColor()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
index 58f5c35..c2ebe48 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
@@ -16,22 +16,23 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.dragGestureFilter
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.dragGestureFilter
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.unit.dp
 
@@ -44,8 +45,8 @@
     val verticalColor = Color(0xfff44336)
     val horizontalColor = Color(0xff2196f3)
 
-    val offset = state { Offset.Zero }
-    val canStartVertically = state { true }
+    val offset = remember { mutableStateOf(Offset.Zero) }
+    val canStartVertically = remember { mutableStateOf(true) }
 
     val dragObserver =
         if (canStartVertically.value) {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
index 8adf3d1..d245991 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
@@ -16,22 +16,10 @@
 
 package androidx.compose.ui.demos.gestures
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.ContentDrawScope
-import androidx.compose.ui.DrawModifier
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.Row
@@ -43,14 +31,27 @@
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.ContentDrawScope
+import androidx.compose.ui.DrawModifier
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.ScrollCallback
 import androidx.compose.ui.gesture.doubleTapGestureFilter
 import androidx.compose.ui.gesture.longPressGestureFilter
 import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.ui.gesture.scrollGestureFilter
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.clipRect
 import androidx.compose.ui.platform.DensityAmbient
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
@@ -86,7 +87,7 @@
             -drawerWidth.toPx()
         }
 
-    val currentOffset = state { minOffset }
+    val currentOffset = remember { mutableStateOf(minOffset) }
     val maxOffset = 0f
 
     val scrollObserver = object : ScrollCallback {
@@ -134,8 +135,8 @@
 @Composable
 private fun Scrollable(orientation: Orientation, children: @Composable () -> Unit) {
     val maxOffset = 0f
-    val offset = state { maxOffset }
-    val minOffset = state { 0f }
+    val offset = remember { mutableStateOf(maxOffset) }
+    val minOffset = remember { mutableStateOf(0f) }
 
     val scrollObserver = object : ScrollCallback {
         override fun onScroll(scrollDistance: Float): Float {
@@ -235,8 +236,8 @@
     val pressedColor = PressedColor
     val defaultColor = Red
 
-    val color = state { defaultColor }
-    val showPressed = state { false }
+    val color = remember { mutableStateOf(defaultColor) }
+    val showPressed = remember { mutableStateOf(false) }
 
     val onPress: (Offset) -> Unit = {
         showPressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
index 81f9b34..e918416 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
@@ -15,30 +15,31 @@
  */
 package androidx.compose.ui.demos.keyinput
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.ExperimentalFocus
-import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.input.key.ExperimentalKeyInput
-import androidx.compose.ui.input.key.Key
-import androidx.compose.ui.input.key.KeyEvent
-import androidx.compose.ui.input.key.KeyEventType
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus
+import androidx.compose.ui.focus.ExperimentalFocus
+import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.isFocused
 import androidx.compose.ui.focusObserver
 import androidx.compose.ui.focusRequester
 import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.key.ExperimentalKeyInput
+import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.key.KeyEventType
 import androidx.compose.ui.input.key.keyInputFilter
 
 @Composable
@@ -52,13 +53,13 @@
             )
         }
         CenteredRow {
-            FocusableText(state { "Enter Text Here" })
+            FocusableText(remember { mutableStateOf("Enter Text Here") })
         }
         CenteredRow {
-            FocusableText(state { "Enter Text Here" })
+            FocusableText(remember { mutableStateOf("Enter Text Here") })
         }
         CenteredRow {
-            FocusableText(state { "Enter Text Here" })
+            FocusableText(remember { mutableStateOf("Enter Text Here") })
         }
     }
 }
@@ -69,7 +70,7 @@
     ExperimentalKeyInput::class
 )
 private fun FocusableText(text: MutableState<String>) {
-    var color by state { Color.Black }
+    var color by remember { mutableStateOf(Color.Black) }
     val focusRequester = FocusRequester()
     Text(
         modifier = Modifier
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
index 5d4b705..f5074b7 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
@@ -24,11 +24,6 @@
 import android.widget.FrameLayout
 import android.widget.LinearLayout
 import android.widget.TextView
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
@@ -36,6 +31,12 @@
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.size
 import androidx.compose.material.Button
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.demos.databinding.TestLayoutBinding
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.toArgb
@@ -60,7 +61,7 @@
         AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })
 
         // Compose Android View and update its size based on state. The AndroidView takes modifiers.
-        var size by state { 20 }
+        var size by remember { mutableStateOf(20) }
         AndroidView(::View, Modifier.clickable { size += 20 }.background(Color.Blue)) { view ->
             view.layoutParams = ViewGroup.LayoutParams(size, size)
         }
@@ -93,7 +94,7 @@
         Button(onClick = { squareRef.value!!.size += 50 }) {
             Text("Increase size of Android view")
         }
-        val colorIndex = state { 0 }
+        val colorIndex = remember { mutableStateOf(0) }
         Button(onClick = {
             colorIndex.value = (colorIndex.value + 1) % 4
             squareRef.value!!.color = arrayOf(
diff --git a/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt b/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
index 6a732db..e01a857 100644
--- a/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
+++ b/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
@@ -24,10 +24,11 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.viewinterop.AndroidView
 
 @Sampled
@@ -36,7 +37,7 @@
     // Compose a TextView.
     AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })
     // Compose a View and update its size based on state. Note the modifiers.
-    var size by state { 20 }
+    var size by remember { mutableStateOf(20) }
     AndroidView(::View, Modifier.clickable { size += 20 }.background(Color.Blue)) { view ->
         view.layoutParams = ViewGroup.LayoutParams(size, size)
     }
diff --git a/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/DialogSample.kt b/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/DialogSample.kt
index ec5a720..9d2e392 100644
--- a/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/DialogSample.kt
+++ b/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/DialogSample.kt
@@ -20,7 +20,8 @@
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
@@ -29,7 +30,7 @@
 @Sampled
 @Composable
 fun DialogSample() {
-    val openDialog = state { true }
+    val openDialog = remember { mutableStateOf(true) }
     val dialogWidth = 200.dp
     val dialogHeight = 50.dp
 
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
index b7663f9..2b2aa18 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
@@ -29,8 +29,12 @@
 import android.widget.FrameLayout
 import android.widget.LinearLayout
 import androidx.annotation.RequiresApi
+import androidx.compose.foundation.drawBackground
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.FrameManager
+import androidx.compose.runtime.Providers
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.emptyContent
@@ -38,17 +42,6 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.constrainHeight
-import androidx.compose.ui.unit.constrainWidth
-import androidx.compose.ui.layout.layoutId
-import androidx.compose.ui.unit.offset
-import androidx.compose.foundation.drawBackground
-import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
@@ -58,23 +51,29 @@
 import androidx.compose.ui.graphics.drawscope.Stroke
 import androidx.compose.ui.graphics.drawscope.clipRect
 import androidx.compose.ui.graphics.drawscope.translate
-import androidx.compose.foundation.layout.offset
-import androidx.compose.foundation.layout.padding
-import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.IntrinsicMeasurable
 import androidx.compose.ui.layout.IntrinsicMeasureScope
+import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.id
+import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.node.InternalCoreApi
 import androidx.compose.ui.node.Owner
 import androidx.compose.ui.node.Ref
+import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
 import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.platform.LayoutDirectionAmbient
 import androidx.compose.ui.platform.setContent
+import androidx.compose.ui.test.TestActivity
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.constrainHeight
+import androidx.compose.ui.unit.constrainWidth
+import androidx.compose.ui.unit.offset
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNotNull
@@ -2191,7 +2190,7 @@
         activityTestRule.runOnUiThreadIR {
             activity.setContent {
                 Layout(children = {
-                    val state = state { false }
+                    val state = remember { mutableStateOf(false) }
                     var lastLayoutValue: Boolean = false
                     Layout(children = {}, modifier = Modifier.drawBehind {
                         // this verifies the layout was remeasured before being drawn
@@ -3129,7 +3128,7 @@
     offset: State<Int>,
     child: @Composable () -> Unit
 ) {
-    val maxPosition = state { Constraints.Infinity }
+    val maxPosition = remember { mutableStateOf(Constraints.Infinity) }
     ScrollerLayout(
         modifier = modifier,
         maxPosition = maxPosition.value,
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
index 79b2b57..e8b45f2 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
@@ -18,15 +18,16 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.AtLeastSize
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.paint
 import androidx.compose.ui.drawBehind
-import androidx.compose.ui.test.R
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.res.loadVectorResource
+import androidx.compose.ui.test.R
 import java.util.concurrent.CountDownLatch
 
 class VectorInvalidationTestCase(var latch: CountDownLatch) {
@@ -42,7 +43,7 @@
 
     @Composable
     fun createTestVector() {
-        val state = state { R.drawable.ic_triangle2 }
+        val state = remember { mutableStateOf(R.drawable.ic_triangle2) }
         vectorState = state
 
         val vectorAsset = loadVectorResource(state.value)
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
index b611c22..816ff9b 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
@@ -17,32 +17,33 @@
 package androidx.compose.ui.input.pointer
 
 import android.os.Build
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.emptyContent
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Layout
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.TransformOrigin
 import androidx.compose.ui.drawBehind
 import androidx.compose.ui.drawLayer
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.pressIndicatorGestureFilter
-import androidx.compose.ui.platform.testTag
-import androidx.compose.foundation.Box
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.toArgb
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.offset
-import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.ui.platform.DensityAmbient
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performGesture
-import androidx.ui.test.onNodeWithTag
 import androidx.ui.test.down
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.unit.dp
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performGesture
 import org.junit.Assert
 import org.junit.Rule
 import org.junit.Test
@@ -65,7 +66,7 @@
         val testTag = "transformedComposable"
         var latch: CountDownLatch? = null
         rule.setContent {
-            val pressed = state { false }
+            val pressed = remember { mutableStateOf(false) }
             val onStart: (Offset) -> Unit = {
                 pressed.value = true
             }
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/WithConstraintsTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/WithConstraintsTest.kt
index 3081dba..fec4dcd 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/WithConstraintsTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/WithConstraintsTest.kt
@@ -20,6 +20,8 @@
 
 import android.graphics.Bitmap
 import android.os.Build
+import androidx.compose.foundation.layout.Constraints
+import androidx.compose.foundation.layout.DpConstraints
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.emptyContent
@@ -28,40 +30,37 @@
 import androidx.compose.runtime.onDispose
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.Layout
 import androidx.compose.ui.LayoutModifier
 import androidx.compose.ui.Measurable
 import androidx.compose.ui.MeasureBlock
 import androidx.compose.ui.MeasureScope
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.WithConstraints
-import androidx.compose.ui.drawBehind
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.test.TestActivity
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.vector.VectorPainter
-import androidx.compose.foundation.layout.Constraints
-import androidx.compose.foundation.layout.DpConstraints
 import androidx.compose.ui.Padding
 import androidx.compose.ui.Scroller
 import androidx.compose.ui.SquareModel
+import androidx.compose.ui.WithConstraints
 import androidx.compose.ui.assertRect
 import androidx.compose.ui.draw.paint
+import androidx.compose.ui.drawBehind
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.VectorPainter
 import androidx.compose.ui.node.Ref
+import androidx.compose.ui.onPositioned
+import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
+import androidx.compose.ui.platform.DensityAmbient
+import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.runOnUiThreadIR
+import androidx.compose.ui.test.TestActivity
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.waitAndScreenShot
-import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.platform.setContent
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertTrue
 import org.junit.Before
@@ -421,7 +420,7 @@
                         // this replicates the popular pattern we currently use
                         // where we save some data calculated in the measuring block
                         // and then use it in the next composition frame
-                        var model by state { false }
+                        var model by remember { mutableStateOf(false) }
                         Layout({
                             if (model) {
                                 latch.countDown()
@@ -498,7 +497,7 @@
         val drawlatch = CountDownLatch(1)
         rule.runOnUiThread {
             activity.setContent {
-                val state = state { false }
+                val state = remember { mutableStateOf(false) }
                 var lastLayoutValue: Boolean = false
                 val drawModifier = Modifier.drawBehind {
                     // this verifies the layout was remeasured before being drawn
@@ -580,7 +579,7 @@
     fun triggerRootRemeasureWhileRootIsLayouting() {
         rule.runOnUiThread {
             activity.setContent {
-                val state = state { 0 }
+                val state = remember { mutableStateOf(0) }
                 ContainerChildrenAffectsParentSize(100, 100) {
                     WithConstraints {
                         Layout(
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
index 76daa56..7494eb1 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
@@ -19,17 +19,18 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.ambientOf
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.test.espresso.Espresso
 import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
 import androidx.test.uiautomator.UiDevice
-import androidx.compose.ui.Modifier
-import androidx.test.espresso.Espresso
 import androidx.ui.test.assertIsDisplayed
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
 import androidx.ui.test.onNodeWithText
+import androidx.ui.test.performClick
 import androidx.ui.test.runOnIdle
 import org.junit.Assert.assertEquals
 import org.junit.Ignore
@@ -49,7 +50,7 @@
     @Test
     fun dialogTest_isShowingContent() {
         composeTestRule.setContent {
-            val showDialog = state { true }
+            val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
                 Dialog(onCloseRequest = {}) {
@@ -68,8 +69,8 @@
         val textAfterClick = "textAfterClick"
 
         composeTestRule.setContent {
-            val showDialog = state { true }
-            val text = state { textBeforeClick }
+            val showDialog = remember { mutableStateOf(true) }
+            val text = remember { mutableStateOf(textBeforeClick) }
 
             if (showDialog.value) {
                 Dialog(onCloseRequest = {
@@ -99,7 +100,7 @@
     @Test
     fun dialogTest_isDismissed_whenSpecified() {
         composeTestRule.setContent {
-            val showDialog = state { true }
+            val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
                 Dialog(onCloseRequest = {
@@ -123,7 +124,7 @@
     @Test
     fun dialogTest_isNotDismissed_whenNotSpecified() {
         composeTestRule.setContent {
-            val showDialog = state { true }
+            val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
                 Dialog(onCloseRequest = {}) {
@@ -146,7 +147,7 @@
     @Test
     fun dialogTest_isDismissed_whenSpecified_backButtonPressed() {
         composeTestRule.setContent {
-            val showDialog = state { true }
+            val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
                 Dialog(onCloseRequest = {
@@ -171,7 +172,7 @@
     @Test
     fun dialogTest_isNotDismissed_whenNotSpecified_backButtonPressed() {
         composeTestRule.setContent {
-            val showDialog = state { true }
+            val showDialog = remember { mutableStateOf(true) }
 
             if (showDialog.value) {
                 Dialog(onCloseRequest = {}) {
diff --git a/ui/ui-core/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt b/ui/ui-core/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
index ceffb5f..d043d93 100644
--- a/ui/ui-core/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
+++ b/ui/ui-core/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
@@ -24,12 +24,12 @@
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.ambientOf
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.neverEqualPolicy
 import androidx.compose.runtime.onDispose
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.savedinstancestate.UiSavedStateRegistryAmbient
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.runtime.staticAmbientOf
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelStoreOwner
@@ -68,11 +68,12 @@
     val view = owner.view
     val context = view.context
 
-    var configuration by state(
-        @OptIn(ExperimentalComposeApi::class)
-        neverEqualPolicy()
-    ) {
-        context.applicationContext.resources.configuration
+    var configuration by remember {
+        mutableStateOf(
+            context.applicationContext.resources.configuration,
+            @OptIn(ExperimentalComposeApi::class)
+            neverEqualPolicy()
+        )
     }
     // onConfigurationChange is the correct hook to update configuration, however it is
     // possible that the configuration object itself may come from a wrapped
diff --git a/ui/ui-core/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt b/ui/ui-core/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt
index 683ff0a..4c26796 100644
--- a/ui/ui-core/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt
+++ b/ui/ui-core/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt
@@ -18,8 +18,8 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.gesture.dragGestureFilter
 import androidx.compose.ui.gesture.longPressDragGestureFilter
@@ -35,7 +35,7 @@
  */
 @Composable
 internal fun SelectionContainer(children: @Composable () -> Unit) {
-    val selection = state<Selection?> { null }
+    val selection = remember { mutableStateOf<Selection?>(null) }
     SelectionContainer(
         selection = selection.value,
         onSelectionChange = { selection.value = it },
diff --git a/ui/ui-core/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt b/ui/ui-core/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt
index 9ab400e..8c46e50 100644
--- a/ui/ui-core/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt
+++ b/ui/ui-core/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt
@@ -17,8 +17,8 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
 import androidx.compose.ui.Layout
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
@@ -58,7 +58,7 @@
 
 @Composable
 internal fun DesktopSelectionContainer(children: @Composable () -> Unit) {
-    val selection = state<Selection?> { null }
+    val selection = remember { mutableStateOf<Selection?>(null) }
     DesktopSelectionContainer(
         selection = selection.value,
         onSelectionChange = { selection.value = it },
diff --git a/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/example1/Main.kt b/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/example1/Main.kt
index 6f1ab0b..8a123ab 100644
--- a/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/example1/Main.kt
+++ b/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/example1/Main.kt
@@ -32,10 +32,12 @@
 import androidx.compose.material.Slider
 import androidx.compose.material.TextField
 import androidx.compose.material.TopAppBar
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.imageResource
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.font.fontFamily
@@ -44,7 +46,6 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.ui.desktop.AppWindow
-import androidx.compose.ui.res.imageResource
 
 private const val title = "Desktop Compose Elements"
 
@@ -67,9 +68,11 @@
                 )
             },
             bodyContent = {
-                val amount = state { 0 }
-                val animation = state { true }
-                val text = state { "Hello \uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0\nПривет" }
+                val amount = remember { mutableStateOf(0) }
+                val animation = remember { mutableStateOf(true) }
+                val text = remember {
+                    mutableStateOf("Hello \uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0\nПривет")
+                }
                 Column(Modifier.fillMaxSize(), Arrangement.SpaceEvenly) {
                     Text(
                         text = "Привет! 你好! Desktop Compose ${amount.value}",
diff --git a/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/popupexample/AppContent.kt b/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/popupexample/AppContent.kt
index 7a283f0..716f3da 100644
--- a/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/popupexample/AppContent.kt
+++ b/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/popupexample/AppContent.kt
@@ -33,7 +33,8 @@
 import androidx.compose.material.Surface
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -48,9 +49,9 @@
 @Composable
 fun content() {
 
-    val popupState = state { false }
-    val dialogState = state { false }
-    val amount = state { 0 }
+    val popupState = remember { mutableStateOf(false) }
+    val dialogState = remember { mutableStateOf(false) }
+    val amount = remember { mutableStateOf(0) }
 
     Surface(
         modifier = Modifier.fillMaxSize(),
diff --git a/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt b/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
index 8e0bcb0..95be524 100644
--- a/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
+++ b/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
@@ -16,14 +16,6 @@
 
 package androidx.compose.foundation.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.ui.demos.common.ComposableDemo
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentColorAmbient
 import androidx.compose.foundation.ContentGravity
@@ -31,8 +23,6 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.currentTextStyle
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
@@ -41,17 +31,27 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.preferredWidth
 import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.ExperimentalLazyDsl
+import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.LazyColumnFor
 import androidx.compose.foundation.lazy.LazyColumnForIndexed
+import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.LazyRowFor
 import androidx.compose.foundation.lazy.LazyRowForIndexed
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LayoutDirectionAmbient
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
-import androidx.compose.foundation.lazy.ExperimentalLazyDsl
-import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.lazy.LazyRow
+import androidx.ui.demos.common.ComposableDemo
 import kotlin.random.Random
 
 val LazyListDemos = listOf(
@@ -84,8 +84,8 @@
 
 @Composable
 private fun ListAddRemoveItemsDemo() {
-    var numItems by state { 0 }
-    var offset by state { 0 }
+    var numItems by remember { mutableStateOf(0) }
+    var offset by remember { mutableStateOf(0) }
     Column {
         Row {
             val buttonModifier = Modifier.padding(8.dp)
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableSamples.kt
index 0084d33..6c7d3bb 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableSamples.kt
@@ -17,16 +17,17 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.clickable
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 
 @Sampled
 @Composable
 fun ClickableSample() {
-    val count = state { 0 }
+    val count = remember { mutableStateOf(0) }
     // content that you want to make clickable
     Text(text = count.value.toString(), modifier = Modifier.clickable { count.value += 1 })
 }
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
index b32d069..4895037 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
@@ -18,12 +18,13 @@
 
 import android.util.Log
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.longPressGestureFilter
 import androidx.compose.foundation.ClickableText
 import androidx.compose.foundation.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.longPressGestureFilter
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextStyle
@@ -52,7 +53,7 @@
     onTextLayout: (TextLayoutResult) -> Unit = {},
     onLongClick: (offset: Int) -> Unit
 ) {
-    val layoutResult = state<TextLayoutResult?> { null }
+    val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
     val gesture = Modifier.longPressGestureFilter(
         onLongPress = { pos ->
             layoutResult.value?.let { layout ->
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
index 82dce3d..d900db4d 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
@@ -17,16 +17,17 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.gestures.draggable
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.offsetPx
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.preferredWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 
 @Sampled
@@ -37,7 +38,7 @@
     val max = 300.dp
     val min = 0.dp
     // this is the  state we will update while dragging
-    val offsetPosition = state { 0f }
+    val offsetPosition = remember { mutableStateOf(0f) }
 
     // seekbar itself
     Box(
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
index c052810..737bf7b 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
@@ -17,17 +17,18 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentGravity
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.gestures.rememberScrollableController
 import androidx.compose.foundation.gestures.scrollable
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
@@ -37,7 +38,7 @@
 @Composable
 fun ScrollableSample() {
     // actual composable state
-    val offset = state { 0f }
+    val offset = remember { mutableStateOf(0f) }
     // state for Scrollable, describes how to consume scrolling delta and update offset
     Box(
         Modifier
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
index 14c3db3..a7b43ac 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
@@ -17,19 +17,20 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
-import androidx.compose.foundation.selection.selectable
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.selection.selectable
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 
 @Sampled
@@ -37,7 +38,7 @@
 fun SelectableSample() {
     val option1 = Color.Red
     val option2 = Color.Blue
-    var selectedOption by state { option1 }
+    var selectedOption by remember { mutableStateOf(option1) }
     Column {
         Text("Selected: $selectedOption")
         Row {
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
index d5f5716..fd4d2d4 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
@@ -17,20 +17,21 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.selection.ToggleableState
 import androidx.compose.foundation.selection.toggleable
 import androidx.compose.foundation.selection.triStateToggleable
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
 
 @Sampled
 @Composable
 fun ToggleableSample() {
-    var checked by state { false }
+    var checked by remember { mutableStateOf(false) }
     // content that you want to make toggleable
     Text(
         modifier = Modifier.toggleable(value = checked, onValueChange = { checked = it }),
@@ -41,7 +42,7 @@
 @Sampled
 @Composable
 fun TriStateToggleableSample() {
-    var checked by state { ToggleableState.Indeterminate }
+    var checked by remember { mutableStateOf(ToggleableState.Indeterminate) }
     // content that you want to make toggleable
     Text(
         modifier = Modifier.triStateToggleable(
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
index 1bf2159..73df2b1 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
@@ -17,7 +17,6 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentGravity
 import androidx.compose.foundation.Text
@@ -27,10 +26,11 @@
 import androidx.compose.foundation.gestures.zoomable
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.drawLayer
@@ -45,7 +45,7 @@
         Modifier.preferredSize(300.dp).clipToBounds(),
         backgroundColor = Color.LightGray
     ) {
-        var scale by state(structuralEqualityPolicy()) { 1f }
+        var scale by remember { mutableStateOf(1f) }
         val zoomableController = rememberZoomableController { scale *= it }
         Box(
             Modifier
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
index f9e9ce0..9fde616 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
@@ -16,29 +16,29 @@
 
 package androidx.compose.foundation
 
+import androidx.compose.foundation.layout.Stack
+import androidx.compose.foundation.selection.selectable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
 import androidx.compose.ui.Modifier
-import androidx.compose.foundation.selection.selectable
-import androidx.compose.foundation.layout.Stack
+import androidx.test.filters.MediumTest
 import androidx.ui.test.assertCountEquals
 import androidx.ui.test.assertIsInMutuallyExclusiveGroup
-import androidx.ui.test.assertIsSelected
 import androidx.ui.test.assertIsNotSelected
+import androidx.ui.test.assertIsSelected
 import androidx.ui.test.center
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.down
+import androidx.ui.test.isInMutuallyExclusiveGroup
+import androidx.ui.test.onAllNodes
+import androidx.ui.test.onFirst
+import androidx.ui.test.onNode
+import androidx.ui.test.onNodeWithText
 import androidx.ui.test.performClick
 import androidx.ui.test.performGesture
-import androidx.ui.test.onNode
-import androidx.ui.test.onAllNodes
-import androidx.ui.test.onNodeWithText
-import androidx.ui.test.onFirst
-import androidx.ui.test.isInMutuallyExclusiveGroup
 import androidx.ui.test.runOnIdle
-import androidx.ui.test.down
 import androidx.ui.test.up
 import com.google.common.truth.Truth
 import org.junit.Rule
@@ -72,7 +72,7 @@
     @Test
     fun selectable_defaultClicks() {
         composeTestRule.setContent {
-            val (selected, onSelected) = state { false }
+            val (selected, onSelected) = remember { mutableStateOf(false) }
             Text(
                 "Text in item",
                 modifier = Modifier.selectable(
@@ -93,7 +93,7 @@
     @Test
     fun selectable_noClicksNoChanges() {
         composeTestRule.setContent {
-            val (selected, _) = state { false }
+            val (selected, _) = remember { mutableStateOf(false) }
             Text(
                 "Text in item",
                 modifier = Modifier.selectable(
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SoftwareKeyboardTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SoftwareKeyboardTest.kt
index 20c385b..290ef9a 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SoftwareKeyboardTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SoftwareKeyboardTest.kt
@@ -16,20 +16,21 @@
 
 package androidx.compose.foundation
 
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.state
-import androidx.test.filters.SmallTest
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.compose.ui.text.SoftwareKeyboardController
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.TextInputService
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.test.filters.SmallTest
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.hasInputMethodsSupport
 import androidx.ui.test.onNode
 import androidx.ui.test.performClick
 import androidx.ui.test.runOnIdle
-import androidx.compose.ui.text.SoftwareKeyboardController
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.times
@@ -60,7 +61,7 @@
             Providers(
                 TextInputServiceAmbient provides textInputService
             ) {
-                val state = state { TextFieldValue("") }
+                val state = remember { mutableStateOf(TextFieldValue("")) }
                 BaseTextField(
                     value = state.value,
                     modifier = Modifier.fillMaxSize(),
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldFocusTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldFocusTest.kt
index b8b51c1..23d4727 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldFocusTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldFocusTest.kt
@@ -16,19 +16,20 @@
 
 package androidx.compose.foundation
 
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.text.CoreTextField
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.test.annotation.UiThreadTest
-import androidx.test.filters.LargeTest
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.FocusModifier
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.foundation.layout.width
+import androidx.compose.ui.unit.dp
+import androidx.test.annotation.UiThreadTest
+import androidx.test.filters.LargeTest
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.runOnIdle
 import androidx.ui.test.runOnUiThread
-import androidx.compose.foundation.text.CoreTextField
-import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
@@ -46,7 +47,7 @@
     @Composable
     private fun TextFieldApp(dataList: List<FocusTestData>) {
         for (data in dataList) {
-            val editor = state { TextFieldValue() }
+            val editor = remember { mutableStateOf(TextFieldValue()) }
             CoreTextField(
                 value = editor.value,
                 modifier = Modifier.width(10.dp).then(data.id),
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldOnValueChangeTextFieldValueTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
index 5ed6084..0460894 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
@@ -17,10 +17,11 @@
 package androidx.compose.foundation
 
 import androidx.compose.runtime.Providers
-import androidx.compose.runtime.state
-import androidx.test.filters.SmallTest
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.input.CommitTextEditOp
 import androidx.compose.ui.text.input.DeleteSurroundingTextEditOp
 import androidx.compose.ui.text.input.EditOperation
@@ -29,14 +30,14 @@
 import androidx.compose.ui.text.input.SetComposingTextEditOp
 import androidx.compose.ui.text.input.SetSelectionEditOp
 import androidx.compose.ui.text.input.TextInputService
+import androidx.test.filters.SmallTest
+import androidx.ui.test.click
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performGesture
-import androidx.ui.test.onNode
 import androidx.ui.test.hasInputMethodsSupport
+import androidx.ui.test.onNode
+import androidx.ui.test.performGesture
 import androidx.ui.test.runOnIdle
 import androidx.ui.test.runOnUiThread
-import androidx.ui.test.click
-import androidx.compose.ui.text.TextRange
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.argumentCaptor
@@ -75,10 +76,12 @@
             Providers(
                 TextInputServiceAmbient provides textInputService
             ) {
-                val state = state {
-                    androidx.compose.ui.text.input.TextFieldValue(
-                        "abcde",
-                        TextRange.Zero
+                val state = remember {
+                    mutableStateOf(
+                        androidx.compose.ui.text.input.TextFieldValue(
+                            "abcde",
+                            TextRange.Zero
+                        )
                     )
                 }
                 BaseTextField(
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldTest.kt
index 4abb81a..d8128f2 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldTest.kt
@@ -20,29 +20,30 @@
 package androidx.compose.foundation
 
 import android.os.Build
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.Providers
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.preferredWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.Providers
 import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.savedinstancestate.savedInstanceState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.text.AnnotatedString
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusState
 import androidx.compose.ui.focusState
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.onPositioned
 import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.input.CommitTextEditOp
@@ -52,8 +53,9 @@
 import androidx.compose.ui.text.input.TextFieldValue.Companion.Saver
 import androidx.compose.ui.text.input.TextInputService
 import androidx.compose.ui.text.length
-import androidx.compose.ui.semantics.SemanticsActions
-import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
 import androidx.ui.test.SemanticsMatcher
 import androidx.ui.test.StateRestorationTester
 import androidx.ui.test.assert
@@ -62,16 +64,15 @@
 import androidx.ui.test.assertTextEquals
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.onNode
-import androidx.ui.test.onNodeWithTag
 import androidx.ui.test.hasImeAction
 import androidx.ui.test.hasInputMethodsSupport
 import androidx.ui.test.isFocused
 import androidx.ui.test.isNotFocused
+import androidx.ui.test.onNode
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performClick
 import androidx.ui.test.performSemanticsAction
 import androidx.ui.test.runOnIdle
-import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.argumentCaptor
@@ -103,7 +104,7 @@
 
         lateinit var focusModifier: FocusModifier
         composeTestRule.setContent {
-            val state = state { TextFieldValue("") }
+            val state = remember { mutableStateOf(TextFieldValue("")) }
             Providers(
                 TextInputServiceAmbient provides inputService
             ) {
@@ -126,7 +127,7 @@
 
     @Composable
     private fun TextFieldApp() {
-        val state = state { TextFieldValue("") }
+        val state = remember { mutableStateOf(TextFieldValue("")) }
         BaseTextField(
             value = state.value,
             modifier = Modifier.fillMaxSize(),
@@ -196,7 +197,7 @@
 
     @Composable
     private fun OnlyDigitsApp() {
-        val state = state { TextFieldValue("") }
+        val state = remember { mutableStateOf(TextFieldValue("")) }
         BaseTextField(
             value = state.value,
             modifier = Modifier.fillMaxSize(),
@@ -280,7 +281,7 @@
             Providers(
                 TextInputServiceAmbient provides textInputService
             ) {
-                val state = state { TextFieldValue("") }
+                val state = remember { mutableStateOf(TextFieldValue("")) }
                 BaseTextField(
                     value = state.value,
                     modifier = Modifier.fillMaxSize(),
@@ -483,7 +484,7 @@
     @Test
     fun semantics_clickAction() {
         composeTestRule.setContent {
-            var value by state { TextFieldValue() }
+            var value by remember { mutableStateOf(TextFieldValue()) }
             BaseTextField(
                 modifier = Modifier.testTag("textField"),
                 value = value,
@@ -501,7 +502,7 @@
     @Test
     fun semantics_setTextSetSelectionActions() {
         composeTestRule.setContent {
-            var value by state { TextFieldValue() }
+            var value by remember { mutableStateOf(TextFieldValue()) }
             BaseTextField(
                 modifier = Modifier.testTag("textField"),
                 value = value,
diff --git a/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt b/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
index e0330cd..62e95f6 100644
--- a/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
+++ b/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
@@ -16,10 +16,14 @@
 
 package androidx.compose.foundation
 
+import androidx.compose.animation.animatedColor
 import androidx.compose.animation.core.AnimatedValue
 import androidx.compose.animation.core.AnimationConstants.Infinite
 import androidx.compose.animation.core.keyframes
 import androidx.compose.animation.core.repeatable
+import androidx.compose.foundation.layout.defaultMinSizeConstraints
+import androidx.compose.foundation.text.CoreTextField
+import androidx.compose.foundation.text.TextFieldDelegate
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
@@ -28,8 +32,6 @@
 import androidx.compose.runtime.onCommit
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.animation.animatedColor
 import androidx.compose.ui.ContentDrawScope
 import androidx.compose.ui.DrawModifier
 import androidx.compose.ui.Modifier
@@ -38,19 +40,16 @@
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.InternalTextApi
+import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.constrain
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.foundation.layout.defaultMinSizeConstraints
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.foundation.text.CoreTextField
-import androidx.compose.ui.text.InternalTextApi
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.foundation.text.TextFieldDelegate
-import androidx.compose.ui.text.TextLayoutResult
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.constrain
 import androidx.compose.ui.unit.dp
 
 // TODO(b/151940543): Remove this variable when we have a solution for idling animations
@@ -138,7 +137,7 @@
     onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
     cursorColor: Color = contentColor()
 ) {
-    val fullModel = state { TextFieldValue() }
+    val fullModel = remember { mutableStateOf(TextFieldValue()) }
     if (fullModel.value != value) {
         @OptIn(InternalTextApi::class)
         fullModel.value = TextFieldValue(
diff --git a/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/ClickableText.kt b/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/ClickableText.kt
index 7381145..1b30294 100644
--- a/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/ClickableText.kt
+++ b/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/ClickableText.kt
@@ -16,7 +16,8 @@
 package androidx.compose.foundation
 
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.gesture.pressIndicatorGestureFilter
 import androidx.compose.ui.gesture.tapGestureFilter
@@ -66,7 +67,7 @@
     onTextLayout: (TextLayoutResult) -> Unit = {},
     onClick: (Int) -> Unit
 ) {
-    val layoutResult = state<TextLayoutResult?> { null }
+    val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
     val pressIndicator = Modifier.tapGestureFilter { pos ->
         layoutResult.value?.let { layoutResult ->
             onClick(layoutResult.getOffsetForPosition(pos))
diff --git a/ui/ui-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt b/ui/ui-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
index 436aec7..e0340aa 100644
--- a/ui/ui-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
+++ b/ui/ui-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
@@ -17,11 +17,6 @@
 package androidx.compose.foundation.layout.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.layout.absoluteOffset
 import androidx.compose.foundation.layout.absoluteOffsetPx
@@ -29,6 +24,12 @@
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.offsetPx
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.tapGestureFilter
 import androidx.compose.ui.unit.dp
 
 @Sampled
@@ -61,7 +62,7 @@
 fun LayoutOffsetPxModifier() {
     // This text will be offset in steps of 10.dp from the top left of the available space in
     // left-to-right context, and from top right in right-to-left context.
-    val offset = state { 0f }
+    val offset = remember { mutableStateOf(0f) }
     Text(
         "Layout offset modifier sample",
         Modifier
@@ -74,7 +75,7 @@
 @Composable
 fun LayoutAbsoluteOffsetPxModifier() {
     // This text will be offset in steps of 10.dp from the top left of the available space.
-    val offset = state { 0f }
+    val offset = remember { mutableStateOf(0f) }
     Text(
         "Layout offset modifier sample",
         Modifier
diff --git a/ui/ui-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutOffsetTest.kt b/ui/ui-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutOffsetTest.kt
index ba9821c..8217b21 100644
--- a/ui/ui-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutOffsetTest.kt
+++ b/ui/ui-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutOffsetTest.kt
@@ -17,22 +17,23 @@
 package androidx.compose.foundation.layout
 
 import android.os.Build
-import androidx.compose.runtime.state
-import androidx.test.filters.SmallTest
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.onPositioned
 import androidx.compose.foundation.Box
 import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.onPositioned
 import androidx.compose.ui.platform.LayoutDirectionAmbient
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.SmallTest
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.onNodeWithTag
 import androidx.ui.test.runOnIdle
-import androidx.compose.ui.unit.dp
 import org.junit.Assert
 import org.junit.Assume
 import org.junit.Before
@@ -186,7 +187,10 @@
             Stack(
                 Modifier.testTag("stack")
                     .wrapContentSize(Alignment.TopStart)
-                    .offsetPx(state { offsetX }, state { offsetY })
+                    .offsetPx(
+                        remember { mutableStateOf(offsetX) },
+                        remember { mutableStateOf(offsetY) }
+                    )
                     .onPositioned { coordinates: LayoutCoordinates ->
                         positionX = coordinates.positionInRoot.x
                         positionY = coordinates.positionInRoot.y
@@ -217,7 +221,10 @@
                         .wrapContentSize(Alignment.TopEnd)
                         .preferredWidth(containerWidth)
                         .wrapContentSize(Alignment.TopStart)
-                        .offsetPx(state { offsetX }, state { offsetY })
+                        .offsetPx(
+                            remember { mutableStateOf(offsetX) },
+                            remember { mutableStateOf(offsetY) }
+                        )
                         .onPositioned { coordinates: LayoutCoordinates ->
                             positionX = coordinates.positionInRoot.x
                             positionY = coordinates.positionInRoot.y
@@ -249,7 +256,10 @@
             Stack(
                 Modifier.testTag("stack")
                     .wrapContentSize(Alignment.TopStart)
-                    .absoluteOffsetPx(state { offsetX }, state { offsetY })
+                    .absoluteOffsetPx(
+                        remember { mutableStateOf(offsetX) },
+                        remember { mutableStateOf(offsetY) }
+                    )
                     .onPositioned { coordinates: LayoutCoordinates ->
                         positionX = coordinates.positionInRoot.x
                         positionY = coordinates.positionInRoot.y
@@ -280,7 +290,10 @@
                         .wrapContentSize(Alignment.TopEnd)
                         .preferredWidth(containerWidth)
                         .wrapContentSize(Alignment.TopStart)
-                        .absoluteOffsetPx(state { offsetX }, state { offsetY })
+                        .absoluteOffsetPx(
+                            remember { mutableStateOf(offsetX) },
+                            remember { mutableStateOf(offsetY) }
+                        )
                         .onPositioned { coordinates: LayoutCoordinates ->
                             positionX = coordinates.positionInRoot.x
                             positionY = coordinates.positionInRoot.y
diff --git a/ui/ui-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt b/ui/ui-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
index 9eb3d67..7fc3617 100644
--- a/ui/ui-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
+++ b/ui/ui-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
@@ -18,8 +18,9 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.onPreCommit
-import androidx.compose.runtime.state
+import androidx.compose.runtime.remember
 import androidx.compose.ui.platform.LifecycleOwnerAmbient
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleOwner
@@ -53,7 +54,7 @@
 @Composable
 fun <R, T : R> LiveData<T>.observeAsState(initial: R): State<R> {
     val lifecycleOwner = LifecycleOwnerAmbient.current
-    val state = state { initial }
+    val state = remember { mutableStateOf(initial) }
     onPreCommit(this, lifecycleOwner) {
         val observer = Observer<T> { state.value = it }
         observe(lifecycleOwner, observer)
diff --git a/ui/ui-material/api/current.txt b/ui/ui-material/api/current.txt
index 8e2644e..84728d8 100644
--- a/ui/ui-material/api/current.txt
+++ b/ui/ui-material/api/current.txt
@@ -351,11 +351,11 @@
     method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fixedThresholds-0680j_4(float offset);
     method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fractionalThresholds(@FloatRange(from=0.0, to=1.0) float fraction);
     method @androidx.compose.material.ExperimentalMaterialApi public static <T> androidx.compose.ui.Modifier swipeable(androidx.compose.ui.Modifier, androidx.compose.material.SwipeableState<T> state, java.util.Map<java.lang.Float,? extends T> anchors, kotlin.jvm.functions.Function3<? super androidx.compose.ui.unit.Density,? super java.lang.Float,? super java.lang.Float,java.lang.Float> thresholds, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, boolean enabled = true, boolean reverseDirection = false, float minValue = elvis {
-    var varf5a37ed0: <ErrorType> = anchors.keys.<anonymous class>()
-    if (varf5a37ed0 != null) varf5a37ed0 else Float.NEGATIVE_INFINITY
+    var varf5a37bc5: <ErrorType> = anchors.keys.<anonymous class>()
+    if (varf5a37bc5 != null) varf5a37bc5 else Float.NEGATIVE_INFINITY
 }, float maxValue = elvis {
-    var var1e0457e5: <ErrorType> = anchors.keys.<anonymous class>()
-    if (var1e0457e5 != null) var1e0457e5 else Float.POSITIVE_INFINITY
+    var var1e0454da: <ErrorType> = anchors.keys.<anonymous class>()
+    if (var1e0454da != null) var1e0454da else Float.POSITIVE_INFINITY
 }, androidx.compose.foundation.InteractionState? interactionState = null);
   }
 
diff --git a/ui/ui-material/api/public_plus_experimental_current.txt b/ui/ui-material/api/public_plus_experimental_current.txt
index 8e2644e..84728d8 100644
--- a/ui/ui-material/api/public_plus_experimental_current.txt
+++ b/ui/ui-material/api/public_plus_experimental_current.txt
@@ -351,11 +351,11 @@
     method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fixedThresholds-0680j_4(float offset);
     method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fractionalThresholds(@FloatRange(from=0.0, to=1.0) float fraction);
     method @androidx.compose.material.ExperimentalMaterialApi public static <T> androidx.compose.ui.Modifier swipeable(androidx.compose.ui.Modifier, androidx.compose.material.SwipeableState<T> state, java.util.Map<java.lang.Float,? extends T> anchors, kotlin.jvm.functions.Function3<? super androidx.compose.ui.unit.Density,? super java.lang.Float,? super java.lang.Float,java.lang.Float> thresholds, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, boolean enabled = true, boolean reverseDirection = false, float minValue = elvis {
-    var varf5a37ed0: <ErrorType> = anchors.keys.<anonymous class>()
-    if (varf5a37ed0 != null) varf5a37ed0 else Float.NEGATIVE_INFINITY
+    var varf5a37bc5: <ErrorType> = anchors.keys.<anonymous class>()
+    if (varf5a37bc5 != null) varf5a37bc5 else Float.NEGATIVE_INFINITY
 }, float maxValue = elvis {
-    var var1e0457e5: <ErrorType> = anchors.keys.<anonymous class>()
-    if (var1e0457e5 != null) var1e0457e5 else Float.POSITIVE_INFINITY
+    var var1e0454da: <ErrorType> = anchors.keys.<anonymous class>()
+    if (var1e0454da != null) var1e0454da else Float.POSITIVE_INFINITY
 }, androidx.compose.foundation.InteractionState? interactionState = null);
   }
 
diff --git a/ui/ui-material/api/restricted_current.txt b/ui/ui-material/api/restricted_current.txt
index 8e2644e..84728d8 100644
--- a/ui/ui-material/api/restricted_current.txt
+++ b/ui/ui-material/api/restricted_current.txt
@@ -351,11 +351,11 @@
     method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fixedThresholds-0680j_4(float offset);
     method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fractionalThresholds(@FloatRange(from=0.0, to=1.0) float fraction);
     method @androidx.compose.material.ExperimentalMaterialApi public static <T> androidx.compose.ui.Modifier swipeable(androidx.compose.ui.Modifier, androidx.compose.material.SwipeableState<T> state, java.util.Map<java.lang.Float,? extends T> anchors, kotlin.jvm.functions.Function3<? super androidx.compose.ui.unit.Density,? super java.lang.Float,? super java.lang.Float,java.lang.Float> thresholds, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, boolean enabled = true, boolean reverseDirection = false, float minValue = elvis {
-    var varf5a37ed0: <ErrorType> = anchors.keys.<anonymous class>()
-    if (varf5a37ed0 != null) varf5a37ed0 else Float.NEGATIVE_INFINITY
+    var varf5a37bc5: <ErrorType> = anchors.keys.<anonymous class>()
+    if (varf5a37bc5 != null) varf5a37bc5 else Float.NEGATIVE_INFINITY
 }, float maxValue = elvis {
-    var var1e0457e5: <ErrorType> = anchors.keys.<anonymous class>()
-    if (var1e0457e5 != null) var1e0457e5 else Float.POSITIVE_INFINITY
+    var var1e0454da: <ErrorType> = anchors.keys.<anonymous class>()
+    if (var1e0454da != null) var1e0454da else Float.POSITIVE_INFINITY
 }, androidx.compose.foundation.InteractionState? interactionState = null);
   }
 
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
index fe6361e..bc15bab 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
@@ -16,14 +16,7 @@
 
 package androidx.compose.material.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Text
-import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
@@ -32,14 +25,22 @@
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.selection.selectable
 import androidx.compose.material.RadioButton
 import androidx.compose.material.samples.BottomNavigationSample
 import androidx.compose.material.samples.BottomNavigationWithOnlySelectedLabelsSample
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 
 @Composable
 fun BottomNavigationDemo() {
-    var alwaysShowLabels by state { false }
+    var alwaysShowLabels by remember { mutableStateOf(false) }
     Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Bottom) {
         Row(
             modifier = Modifier
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
index a982bc0..c2e5483 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
@@ -17,41 +17,17 @@
 package androidx.compose.material.demos
 
 import android.graphics.SweepGradient
+import androidx.compose.animation.DpPropKey
 import androidx.compose.animation.core.FloatPropKey
 import androidx.compose.animation.core.transitionDefinition
 import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.emptyContent
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.animation.DpPropKey
 import androidx.compose.animation.transition
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.WithConstraints
-import androidx.compose.ui.draw.drawOpacity
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.dragGestureFilter
 import androidx.compose.foundation.Border
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentGravity
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.currentTextStyle
-import androidx.compose.foundation.shape.GenericShape
-import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Radius
-import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.ImageAsset
-import androidx.compose.ui.graphics.Paint
-import androidx.compose.ui.graphics.SolidColor
-import androidx.compose.ui.graphics.isSet
-import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.graphics.toPixelMap
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
@@ -64,9 +40,33 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.GenericShape
 import androidx.compose.material.Surface
 import androidx.compose.material.TopAppBar
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.emptyContent
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.WithConstraints
+import androidx.compose.ui.draw.drawOpacity
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Radius
 import androidx.compose.ui.geometry.RoundRect
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.dragGestureFilter
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ImageAsset
+import androidx.compose.ui.graphics.Paint
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.isSet
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.graphics.toPixelMap
+import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
@@ -79,7 +79,7 @@
  */
 @Composable
 fun ColorPickerDemo() {
-    var primary by state { Color(0xFF6200EE) }
+    var primary by remember { mutableStateOf(Color(0xFF6200EE)) }
     Surface(color = Color(0xFF121212)) {
         Column {
             TopAppBar(title = { Text("Color Picker") }, backgroundColor = primary)
@@ -96,10 +96,10 @@
             .aspectRatio(1f)
     ) {
         val diameter = constraints.maxWidth
-        var position by state { Offset.Zero }
+        var position by remember { mutableStateOf(Offset.Zero) }
         val colorWheel = remember(diameter) { ColorWheel(diameter) }
 
-        var isDragging by state { false }
+        var isDragging by remember { mutableStateOf(false) }
         val inputModifier = SimplePointerInput(
             position = position,
             onPositionChange = { newPosition ->
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
index ffaf410..683a73c 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
@@ -16,25 +16,26 @@
 
 package androidx.compose.material.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Icon
 import androidx.compose.foundation.Text
+import androidx.compose.foundation.layout.Stack
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.foundation.layout.Stack
 import androidx.compose.material.DropdownMenu
 import androidx.compose.material.DropdownMenuItem
 import androidx.compose.material.IconButton
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.MoreVert
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.Position
 import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
@@ -72,7 +73,7 @@
         "Signout"
     )
 
-    var expanded by state { false }
+    var expanded by remember { mutableStateOf(false) }
 
     val iconButton = @Composable {
         IconButton(onClick = { expanded = true }) {
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
index ae4a45b..4b5f996 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
@@ -16,13 +16,8 @@
 
 package androidx.compose.material.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.preferredHeight
@@ -35,12 +30,18 @@
 import androidx.compose.material.samples.ScrollingTextTabs
 import androidx.compose.material.samples.TextAndIconTabs
 import androidx.compose.material.samples.TextTabs
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 
 @Composable
 fun TabDemo() {
     ScrollableColumn {
-        val showingSimple = state { true }
+        val showingSimple = remember { mutableStateOf(true) }
         val buttonText = "Show ${if (showingSimple.value) "custom" else "simple"} tabs"
 
         Spacer(Modifier.height(24.dp))
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/OverviewScreen.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/OverviewScreen.kt
index 07cb41e..a8fa3c5 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/OverviewScreen.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/OverviewScreen.kt
@@ -17,12 +17,6 @@
 package androidx.compose.material.studies.rally
 
 import android.annotation.SuppressLint
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.layout.Arrangement
@@ -39,6 +33,13 @@
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.TextButton
 import androidx.compose.material.icons.Icons
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import java.util.Locale
 
@@ -58,7 +59,7 @@
  */
 @Composable
 private fun AlertCard() {
-    var openDialog by state { false }
+    var openDialog by remember { mutableStateOf(false) }
     val alertMessage = "Heads up, you've used up 90% of your Shopping budget for this month."
 
     if (openDialog) {
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyActivity.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyActivity.kt
index 6ae0a03..1dfc1a4 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyActivity.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyActivity.kt
@@ -18,15 +18,16 @@
 
 import android.os.Bundle
 import androidx.activity.ComponentActivity
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.setContent
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.layout.padding
 import androidx.compose.material.Scaffold
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.setContent
 
 /**
  * This Activity recreates the Rally Material Study from
@@ -45,7 +46,7 @@
 fun RallyApp() {
     RallyTheme {
         val allScreens = RallyScreenState.values().toList()
-        var currentScreen by state { RallyScreenState.Overview }
+        var currentScreen by remember { mutableStateOf(RallyScreenState.Overview) }
         Scaffold(
             topBar = {
                 RallyTopAppBar(
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
index b8b1421..4963f16 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
@@ -17,9 +17,6 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Row
@@ -29,12 +26,16 @@
 import androidx.compose.material.AlertDialogButtonLayout
 import androidx.compose.material.Button
 import androidx.compose.material.TextButton
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 
 @Sampled
 @Composable
 fun SideBySideAlertDialogSample() {
-    val openDialog = state { true }
+    val openDialog = remember { mutableStateOf(true) }
 
     if (openDialog.value) {
         AlertDialog(
@@ -75,7 +76,7 @@
 @Sampled
 @Composable
 fun StackedAlertDialogSample() {
-    val openDialog = state { true }
+    val openDialog = remember { mutableStateOf(true) }
 
     if (openDialog.value) {
         AlertDialog(
@@ -115,7 +116,7 @@
 @Sampled
 @Composable
 fun CustomAlertDialogSample() {
-    val openDialog = state { true }
+    val openDialog = remember { mutableStateOf(true) }
 
     if (openDialog.value) {
         AlertDialog(
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/BottomNavigationSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/BottomNavigationSamples.kt
index 3373edc..2806fb3 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/BottomNavigationSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/BottomNavigationSamples.kt
@@ -17,21 +17,22 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.foundation.Icon
 import androidx.compose.foundation.Text
 import androidx.compose.material.BottomNavigation
 import androidx.compose.material.BottomNavigationItem
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 
 @Sampled
 @Composable
 fun BottomNavigationSample() {
-    var selectedItem by state { 0 }
+    var selectedItem by remember { mutableStateOf(0) }
     val items = listOf("Songs", "Artists", "Playlists")
 
     BottomNavigation {
@@ -48,7 +49,7 @@
 
 @Composable
 fun BottomNavigationWithOnlySelectedLabelsSample() {
-    var selectedItem by state { 0 }
+    var selectedItem by remember { mutableStateOf(0) }
     val items = listOf("Songs", "Artists", "Playlists")
 
     BottomNavigation {
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/IconButtonSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/IconButtonSamples.kt
index a6bd23a..715be7f 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/IconButtonSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/IconButtonSamples.kt
@@ -17,17 +17,18 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.animation.animate
 import androidx.compose.foundation.Icon
-import androidx.compose.ui.graphics.Color
 import androidx.compose.material.IconButton
 import androidx.compose.material.IconToggleButton
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.graphics.Color
 
 @Sampled
 @Composable
@@ -40,7 +41,7 @@
 @Sampled
 @Composable
 fun IconToggleButtonSample() {
-    var checked by state { false }
+    var checked by remember { mutableStateOf(false) }
 
     IconToggleButton(checked = checked, onCheckedChange = { checked = it }) {
         val tint = animate(if (checked) Color(0xFFEC407A) else Color(0xFFB0BEC5))
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
index 21e6bd5..d7a2d90 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
@@ -17,21 +17,22 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.foundation.Icon
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.contentColor
-import androidx.compose.ui.graphics.ColorFilter
-import androidx.compose.ui.graphics.ImageAsset
-import androidx.compose.ui.graphics.vector.VectorAsset
 import androidx.compose.foundation.layout.Column
 import androidx.compose.material.Checkbox
 import androidx.compose.material.Divider
 import androidx.compose.material.ListItem
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.graphics.ImageAsset
+import androidx.compose.ui.graphics.vector.VectorAsset
 
 @Sampled
 @Composable
@@ -113,7 +114,7 @@
             icon = { Image(icon40x40, colorFilter = ColorFilter.tint(contentColor())) }
         )
         Divider()
-        var checked by state { false }
+        var checked by remember { mutableStateOf(false) }
         ListItem(
             text = { Text("Two line list item") },
             secondaryText = { Text("Secondary text") },
@@ -236,7 +237,7 @@
             secondaryText = { Text("Secondary text") },
             icon = { Image(icon40x40, colorFilter = ColorFilter.tint(contentColor())) },
             trailing = {
-                var checked by state { false }
+                var checked by remember { mutableStateOf(false) }
                 Checkbox(checked, onCheckedChange = { checked = !checked })
             },
             onClick = {}
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
index 70e66a1..3181b86 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
@@ -17,12 +17,6 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Icon
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.layout.fillMaxSize
@@ -33,11 +27,18 @@
 import androidx.compose.material.IconButton
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.MoreVert
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
 
 @Sampled
 @Composable
 fun MenuSample() {
-    var expanded by state { false }
+    var expanded by remember { mutableStateOf(false) }
 
     val iconButton = @Composable {
         IconButton(onClick = { expanded = true }) {
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
index 34a8b74..086c235 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
@@ -17,27 +17,27 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Text
-import androidx.compose.foundation.selection.ToggleableState
-import androidx.compose.foundation.selection.selectable
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.foundation.selection.ToggleableState
+import androidx.compose.foundation.selection.selectable
 import androidx.compose.material.Checkbox
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.RadioButton
 import androidx.compose.material.Switch
 import androidx.compose.material.TriStateCheckbox
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 
 @Sampled
@@ -45,8 +45,8 @@
 fun TriStateCheckboxSample() {
     Column {
         // define dependent checkboxes states
-        val (state, onStateChange) = state { true }
-        val (state2, onStateChange2) = state { true }
+        val (state, onStateChange) = remember { mutableStateOf(true) }
+        val (state2, onStateChange2) = remember { mutableStateOf(true) }
 
         // TriStateCheckbox state reflects state of dependent checkboxes
         val parentState = remember(state, state2) {
@@ -76,7 +76,7 @@
 @Sampled
 @Composable
 fun CheckboxSample() {
-    val checkedState = state { true }
+    val checkedState = remember { mutableStateOf(true) }
     Checkbox(
         checked = checkedState.value,
         onCheckedChange = { checkedState.value = it }
@@ -86,7 +86,7 @@
 @Sampled
 @Composable
 fun SwitchSample() {
-    val checkedState = state { true }
+    val checkedState = remember { mutableStateOf(true) }
     Switch(
         checked = checkedState.value,
         onCheckedChange = { checkedState.value = it }
@@ -98,7 +98,7 @@
 fun RadioButtonSample() {
     // we have two radio buttons and only one can be selected
     // let's emulate binary choice here
-    var enterTheMatrix by state { true }
+    var enterTheMatrix by remember { mutableStateOf(true) }
     Row {
         RadioButton(
             selected = enterTheMatrix,
@@ -117,7 +117,7 @@
 @Composable
 fun RadioGroupSample() {
     val radioOptions = listOf("Calls", "Missed", "Friends")
-    val (selectedOption, onOptionSelected) = state { radioOptions[0] }
+    val (selectedOption, onOptionSelected) = remember { mutableStateOf(radioOptions[0]) }
     Column {
         radioOptions.forEach { text ->
             Row(Modifier
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
index 00685ac..d3b35a4 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
@@ -17,18 +17,19 @@
 package androidx.compose.material.samples
 
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.foundation.Text
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Slider
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 
 @Sampled
 @Composable
 fun SliderSample() {
-    var sliderPosition by state { 0f }
+    var sliderPosition by remember { mutableStateOf(0f) }
     Text(text = sliderPosition.toString())
     Slider(value = sliderPosition, onValueChange = { sliderPosition = it })
 }
@@ -36,7 +37,7 @@
 @Sampled
 @Composable
 fun StepsSliderSample() {
-    var sliderPosition by state { 0f }
+    var sliderPosition by remember { mutableStateOf(0f) }
     Text(text = sliderPosition.toString())
     Slider(
         value = sliderPosition,
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
index a9b4fd6..4e59b8f 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
@@ -16,20 +16,12 @@
 
 package androidx.compose.material.samples
 
-import androidx.compose.animation.core.spring
-import androidx.compose.animation.core.transitionDefinition
 import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.emptyContent
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.animation.ColorPropKey
 import androidx.compose.animation.DpPropKey
+import androidx.compose.animation.core.spring
+import androidx.compose.animation.core.transitionDefinition
 import androidx.compose.animation.transition
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Border
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentGravity
@@ -37,8 +29,6 @@
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.drawBorder
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Stack
@@ -49,17 +39,27 @@
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.preferredWidth
+import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Tab
 import androidx.compose.material.TabRow
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.emptyContent
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
 
 @Sampled
 @Composable
 fun TextTabs() {
-    var state by state { 0 }
+    var state by remember { mutableStateOf(0) }
     val titles = listOf("TAB 1", "TAB 2", "TAB 3 WITH LOTS OF TEXT")
     Column {
         TabRow(items = titles, selectedIndex = state) { index, text ->
@@ -75,7 +75,7 @@
 
 @Composable
 fun IconTabs() {
-    var state by state { 0 }
+    var state by remember { mutableStateOf(0) }
     val icons = listOf(Icons.Filled.Favorite, Icons.Filled.Favorite, Icons.Filled.Favorite)
     Column {
         TabRow(items = icons, selectedIndex = state) { index, icon ->
@@ -91,7 +91,7 @@
 
 @Composable
 fun TextAndIconTabs() {
-    var state by state { 0 }
+    var state by remember { mutableStateOf(0) }
     val titlesAndIcons = listOf(
         "TAB 1" to Icons.Filled.Favorite,
         "TAB 2" to Icons.Filled.Favorite,
@@ -116,7 +116,7 @@
 
 @Composable
 fun ScrollingTextTabs() {
-    var state by state { 0 }
+    var state by remember { mutableStateOf(0) }
     val titles = listOf(
         "TAB 1",
         "TAB 2",
@@ -144,7 +144,7 @@
 @Sampled
 @Composable
 fun FancyTabs() {
-    var state by state { 0 }
+    var state by remember { mutableStateOf(0) }
     val titles = listOf("TAB 1", "TAB 2", "TAB 3")
     Column {
         TabRow(items = titles, selectedIndex = state) { index, title ->
@@ -161,7 +161,7 @@
 @Sampled
 @Composable
 fun FancyIndicatorTabs() {
-    var state by state { 0 }
+    var state by remember { mutableStateOf(0) }
     val titles = listOf("TAB 1", "TAB 2", "TAB 3")
 
     // Reuse the default transition, and provide our custom indicator as its child
@@ -190,7 +190,7 @@
 @Sampled
 @Composable
 fun FancyIndicatorContainerTabs() {
-    var state by state { 0 }
+    var state by remember { mutableStateOf(0) }
     val titles = listOf("TAB 1", "TAB 2", "TAB 3")
 
     val indicatorContainer = @Composable { tabPositions: List<TabRow.TabPosition> ->
@@ -215,7 +215,7 @@
 
 @Composable
 fun ScrollingFancyIndicatorContainerTabs() {
-    var state by state { 0 }
+    var state by remember { mutableStateOf(0) }
     val titles = listOf(
         "TAB 1",
         "TAB 2",
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
index 40c5950..8e1c954 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
@@ -20,30 +20,10 @@
 package androidx.compose.material
 
 import android.os.Build
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.FlakyTest
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.layout.boundsInRoot
-import androidx.compose.ui.onChildPositioned
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.contentColor
 import androidx.compose.foundation.currentTextStyle
-import androidx.compose.foundation.shape.CutCornerShape
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
-import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.InnerPadding
 import androidx.compose.foundation.layout.RowScope
@@ -57,6 +37,34 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.layout.widthIn
+import androidx.compose.foundation.shape.CutCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.compositeOver
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.boundsInRoot
+import androidx.compose.ui.onChildPositioned
+import androidx.compose.ui.onPositioned
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.PxBounds
+import androidx.compose.ui.unit.center
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.height
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.unit.width
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.ui.test.assertHasClickAction
 import androidx.ui.test.assertHasNoClickAction
 import androidx.ui.test.assertHeightIsAtLeast
@@ -67,19 +75,12 @@
 import androidx.ui.test.assertWidthIsEqualTo
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
+import androidx.ui.test.hasClickAction
 import androidx.ui.test.onNode
 import androidx.ui.test.onNodeWithTag
 import androidx.ui.test.onNodeWithText
-import androidx.ui.test.hasClickAction
+import androidx.ui.test.performClick
 import androidx.ui.test.runOnIdle
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.PxBounds
-import androidx.compose.ui.unit.center
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.height
-import androidx.compose.ui.unit.sp
-import androidx.compose.ui.unit.width
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
@@ -152,7 +153,7 @@
         val tag = "myButton"
 
         composeTestRule.setMaterialContent {
-            var enabled by state { true }
+            var enabled by remember { mutableStateOf(true) }
             val onClick = { enabled = false }
             Stack {
                 Button(modifier = Modifier.testTag(tag), onClick = onClick, enabled = enabled) {
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
index 20c0071..50b314a 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
@@ -16,26 +16,27 @@
 package androidx.compose.material
 
 import android.os.Build
-import androidx.compose.runtime.state
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.selection.ToggleableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.screenshot.AndroidXScreenshotTestRule
 import androidx.test.screenshot.assertAgainstGolden
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.selection.ToggleableState
-import androidx.compose.foundation.layout.wrapContentSize
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.center
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
+import androidx.ui.test.down
+import androidx.ui.test.isToggleable
 import androidx.ui.test.onNode
 import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.isToggleable
-import androidx.ui.test.down
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
 import androidx.ui.test.waitForIdle
 import org.junit.Rule
 import org.junit.Test
@@ -142,7 +143,7 @@
     @Test
     fun checkBoxTest_unchecked_animateToChecked() {
         composeTestRule.setMaterialContent {
-            val isChecked = state { false }
+            val isChecked = remember { mutableStateOf(false) }
             Box(wrap.testTag(wrapperTestTag)) {
                 Checkbox(
                     modifier = wrap,
@@ -167,7 +168,7 @@
     @Test
     fun checkBoxTest_checked_animateToUnchecked() {
         composeTestRule.setMaterialContent {
-            val isChecked = state { true }
+            val isChecked = remember { mutableStateOf(true) }
             Box(wrap.testTag(wrapperTestTag)) {
                 Checkbox(
                     modifier = wrap,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxUiTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxUiTest.kt
index a1a2611..316ebb90 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxUiTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxUiTest.kt
@@ -15,25 +15,26 @@
  */
 package androidx.compose.material
 
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.Strings
+import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.selection.ToggleableState
 import androidx.compose.foundation.selection.ToggleableState.Indeterminate
 import androidx.compose.foundation.selection.ToggleableState.Off
 import androidx.compose.foundation.selection.ToggleableState.On
-import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
 import androidx.ui.test.assertHasNoClickAction
 import androidx.ui.test.assertIsEnabled
 import androidx.ui.test.assertIsOff
 import androidx.ui.test.assertIsOn
 import androidx.ui.test.assertValueEquals
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
 import androidx.ui.test.onNodeWithTag
-import androidx.compose.ui.unit.dp
+import androidx.ui.test.performClick
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -71,7 +72,7 @@
     @Test
     fun checkBoxTest_toggle() {
         composeTestRule.setMaterialContent {
-            val (checked, onCheckedChange) = state { false }
+            val (checked, onCheckedChange) = remember { mutableStateOf(false) }
             Checkbox(checked, onCheckedChange, modifier = Modifier.testTag(defaultTag))
         }
 
@@ -84,7 +85,7 @@
     @Test
     fun checkBoxTest_toggle_twice() {
         composeTestRule.setMaterialContent {
-            val (checked, onCheckedChange) = state { false }
+            val (checked, onCheckedChange) = remember { mutableStateOf(false) }
             Checkbox(checked, onCheckedChange, modifier = Modifier.testTag(defaultTag))
         }
 
@@ -100,7 +101,7 @@
     fun checkBoxTest_untoggleable_whenNoLambda() {
 
         composeTestRule.setMaterialContent {
-            val (checked, _) = state { false }
+            val (checked, _) = remember { mutableStateOf(false) }
             Checkbox(checked, {}, enabled = false, modifier = Modifier.testTag(defaultTag))
         }
 
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
index cd03580..05d9abf 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
@@ -17,25 +17,26 @@
 package androidx.compose.material
 
 import android.os.Build
-import androidx.compose.runtime.state
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.screenshot.AndroidXScreenshotTestRule
 import androidx.test.screenshot.assertAgainstGolden
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.layout.wrapContentSize
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.center
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
+import androidx.ui.test.down
+import androidx.ui.test.isInMutuallyExclusiveGroup
 import androidx.ui.test.onNode
 import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.isInMutuallyExclusiveGroup
-import androidx.ui.test.down
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
 import androidx.ui.test.waitForIdle
 import org.junit.Rule
 import org.junit.Test
@@ -115,7 +116,7 @@
     @Test
     fun radioButton_notSelected_animateToSelected() {
         composeTestRule.setMaterialContent {
-            val isSelected = state { false }
+            val isSelected = remember { mutableStateOf(false) }
             Box(wrap.testTag(wrapperTestTag)) {
                 RadioButton(
                     selected = isSelected.value,
@@ -139,7 +140,7 @@
     @Test
     fun radioButton_selected_animateToNotSelected() {
         composeTestRule.setMaterialContent {
-            val isSelected = state { true }
+            val isSelected = remember { mutableStateOf(true) }
             Box(wrap.testTag(wrapperTestTag)) {
                 RadioButton(
                     selected = isSelected.value,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
index eec7677..90a6eda 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
@@ -17,29 +17,30 @@
 package androidx.compose.material
 
 import android.os.Build
-import androidx.compose.runtime.state
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LayoutDirectionAmbient
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.screenshot.AndroidXScreenshotTestRule
 import androidx.test.screenshot.assertAgainstGolden
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
-import androidx.compose.foundation.Box
-import androidx.compose.ui.graphics.Color
-import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.LayoutDirectionAmbient
-import androidx.compose.ui.unit.LayoutDirection
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.center
 import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
+import androidx.ui.test.down
+import androidx.ui.test.isToggleable
 import androidx.ui.test.onNode
 import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.isToggleable
-import androidx.ui.test.down
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
 import androidx.ui.test.waitForIdle
 import org.junit.Rule
 import org.junit.Test
@@ -156,7 +157,7 @@
     @Test
     fun switchTest_unchecked_animateToChecked() {
         composeTestRule.setMaterialContent {
-            val isChecked = state { false }
+            val isChecked = remember { mutableStateOf(false) }
             Box(wrapperModifier) {
                 Switch(
                     checked = isChecked.value,
@@ -180,7 +181,7 @@
     @Test
     fun switchTest_checked_animateToUnchecked() {
         composeTestRule.setMaterialContent {
-            val isChecked = state { true }
+            val isChecked = remember { mutableStateOf(true) }
             Box(wrapperModifier) {
                 Switch(
                     checked = isChecked.value,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
index 6b0dff7..2eaf1a3 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
@@ -16,17 +16,18 @@
 
 package androidx.compose.material
 
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.Strings
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Stack
 import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LayoutDirectionAmbient
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
 import androidx.ui.test.assertHasNoClickAction
 import androidx.ui.test.assertHeightIsEqualTo
 import androidx.ui.test.assertIsEnabled
@@ -35,13 +36,12 @@
 import androidx.ui.test.assertValueEquals
 import androidx.ui.test.assertWidthIsEqualTo
 import androidx.ui.test.createComposeRule
+import androidx.ui.test.onNodeWithTag
 import androidx.ui.test.performClick
 import androidx.ui.test.performGesture
-import androidx.ui.test.onNodeWithTag
 import androidx.ui.test.runOnIdle
 import androidx.ui.test.swipeLeft
 import androidx.ui.test.swipeRight
-import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth
 import org.junit.Rule
 import org.junit.Test
@@ -83,7 +83,7 @@
     @Test
     fun switch_toggle() {
         composeTestRule.setMaterialContent {
-            val (checked, onChecked) = state { false }
+            val (checked, onChecked) = remember { mutableStateOf(false) }
 
             // Stack is needed because otherwise the control will be expanded to fill its parent
             Stack {
@@ -103,7 +103,7 @@
     @Test
     fun switch_toggleTwice() {
         composeTestRule.setMaterialContent {
-            val (checked, onChecked) = state { false }
+            val (checked, onChecked) = remember { mutableStateOf(false) }
 
             // Stack is needed because otherwise the control will be expanded to fill its parent
             Stack {
@@ -125,7 +125,7 @@
     @Test
     fun switch_uncheckableWithNoLambda() {
         composeTestRule.setMaterialContent {
-            val (checked, _) = state { false }
+            val (checked, _) = remember { mutableStateOf(false) }
             Switch(
                 modifier = Modifier.testTag(defaultSwitchTag),
                 checked = checked,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/TabTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/TabTest.kt
index d09a08f..8054fa2 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/TabTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/TabTest.kt
@@ -15,39 +15,40 @@
  */
 package androidx.compose.material
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.LargeTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Icon
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.material.samples.ScrollingTextTabs
 import androidx.compose.material.samples.TextTabs
-import androidx.ui.test.assertCountEquals
-import androidx.ui.test.assertHeightIsEqualTo
-import androidx.ui.test.assertIsEqualTo
-import androidx.ui.test.assertIsSelected
-import androidx.ui.test.assertIsNotSelected
-import androidx.ui.test.assertPositionInRootIsEqualTo
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.onAllNodes
-import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.getUnclippedBoundsInRoot
-import androidx.ui.test.isInMutuallyExclusiveGroup
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.height
 import androidx.compose.ui.unit.width
+import androidx.test.filters.LargeTest
+import androidx.ui.test.assertCountEquals
+import androidx.ui.test.assertHeightIsEqualTo
+import androidx.ui.test.assertIsEqualTo
+import androidx.ui.test.assertIsNotSelected
+import androidx.ui.test.assertIsSelected
+import androidx.ui.test.assertPositionInRootIsEqualTo
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.getUnclippedBoundsInRoot
+import androidx.ui.test.isInMutuallyExclusiveGroup
+import androidx.ui.test.onAllNodes
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performClick
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -104,7 +105,7 @@
         val indicatorHeight = 1.dp
 
         composeTestRule.setMaterialContent {
-            var state by state { 0 }
+            var state by remember { mutableStateOf(0) }
             val titles = listOf("TAB 1", "TAB 2")
 
             val indicatorContainer = @Composable { tabPositions: List<TabRow.TabPosition> ->
@@ -157,7 +158,7 @@
     @Test
     fun singleLineTab_textBaseline() {
         composeTestRule.setMaterialContent {
-            var state by state { 0 }
+            var state by remember { mutableStateOf(0) }
             val titles = listOf("TAB")
 
             Box {
@@ -193,7 +194,7 @@
     @Test
     fun singleLineTab_withIcon_textBaseline() {
         composeTestRule.setMaterialContent {
-            var state by state { 0 }
+            var state by remember { mutableStateOf(0) }
             val titles = listOf("TAB")
 
             Box {
@@ -230,7 +231,7 @@
     @Test
     fun twoLineTab_textBaseline() {
         composeTestRule.setMaterialContent {
-            var state by state { 0 }
+            var state by remember { mutableStateOf(0) }
             val titles = listOf("Two line \n text")
 
             Box {
@@ -271,7 +272,7 @@
         val minimumTabWidth = 90.dp
 
         composeTestRule.setMaterialContent {
-            var state by state { 0 }
+            var state by remember { mutableStateOf(0) }
             val titles = listOf("TAB 1", "TAB 2")
 
             val indicatorContainer = @Composable { tabPositions: List<TabRow.TabPosition> ->
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
index f18e6e8..11d008e 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
@@ -17,27 +17,11 @@
 package androidx.compose.material.textfield
 
 import android.os.Build
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.Ref
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.contentColor
 import androidx.compose.foundation.currentTextStyle
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
-import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.text.input.PasswordVisualTransformation
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.input.TextInputService
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.preferredSize
 import androidx.compose.foundation.layout.preferredWidth
@@ -45,21 +29,38 @@
 import androidx.compose.material.OutlinedTextField
 import androidx.compose.material.runOnIdleWithDensity
 import androidx.compose.material.setMaterialContent
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.node.Ref
+import androidx.compose.ui.onPositioned
 import androidx.compose.ui.platform.TextInputServiceAmbient
-import androidx.ui.test.assertShape
-import androidx.ui.test.captureToBitmap
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
-import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.runOnIdle
-import androidx.ui.test.click
-import androidx.ui.test.performImeAction
-import androidx.ui.test.waitForIdle
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.input.PasswordVisualTransformation
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.input.TextInputService
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.ui.test.assertShape
+import androidx.ui.test.captureToBitmap
+import androidx.ui.test.click
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
+import androidx.ui.test.performImeAction
+import androidx.ui.test.runOnIdle
+import androidx.ui.test.waitForIdle
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.atLeastOnce
@@ -553,7 +554,7 @@
             Providers(
                 TextInputServiceAmbient provides textInputService
             ) {
-                var text = state { TextFieldValue("") }
+                var text = remember { mutableStateOf(TextFieldValue("")) }
                 OutlinedTextField(
                     modifier = Modifier.testTag(TextfieldTag),
                     value = text.value,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
index 44f5d5d..79031e0 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
@@ -17,56 +17,57 @@
 package androidx.compose.material.textfield
 
 import android.os.Build
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.Ref
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.contentColor
 import androidx.compose.foundation.currentTextStyle
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
-import androidx.compose.ui.graphics.compositeOver
-import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.text.input.PasswordVisualTransformation
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.input.TextInputService
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Stack
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.preferredHeight
 import androidx.compose.foundation.layout.preferredSize
-import androidx.compose.material.TextField
+import androidx.compose.foundation.text.FirstBaseline
 import androidx.compose.material.MaterialTheme
+import androidx.compose.material.TextField
 import androidx.compose.material.runOnIdleWithDensity
 import androidx.compose.material.setMaterialContent
 import androidx.compose.material.setMaterialContentForSizeAssertions
-import androidx.ui.test.assertHeightIsEqualTo
-import androidx.ui.test.assertShape
-import androidx.ui.test.captureToBitmap
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
-import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.runOnIdle
-import androidx.ui.test.click
-import androidx.ui.test.performImeAction
-import androidx.ui.test.waitForIdle
-import androidx.compose.foundation.text.FirstBaseline
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.node.Ref
+import androidx.compose.ui.onPositioned
 import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.input.PasswordVisualTransformation
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.input.TextInputService
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.ui.test.assertHeightIsEqualTo
+import androidx.ui.test.assertShape
+import androidx.ui.test.captureToBitmap
+import androidx.ui.test.click
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
+import androidx.ui.test.performImeAction
+import androidx.ui.test.runOnIdle
+import androidx.ui.test.waitForIdle
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.atLeastOnce
@@ -637,7 +638,7 @@
             Providers(
                 TextInputServiceAmbient provides textInputService
             ) {
-                val text = state { TextFieldValue("") }
+                val text = remember { mutableStateOf(TextFieldValue("")) }
                 TextField(
                     modifier = Modifier.testTag(TextfieldTag),
                     value = text.value,
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Menu.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
index 508e849..5aa22fe 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
@@ -20,16 +20,7 @@
 import androidx.compose.animation.core.LinearOutSlowInEasing
 import androidx.compose.animation.core.transitionDefinition
 import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.animation.transition
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.Modifier
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ContentGravity
 import androidx.compose.foundation.ProvideTextStyle
@@ -43,18 +34,27 @@
 import androidx.compose.foundation.layout.preferredSizeIn
 import androidx.compose.foundation.layout.preferredWidth
 import androidx.compose.material.ripple.RippleIndication
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.DrawLayerModifier
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.TransformOrigin
-import androidx.compose.ui.window.Popup
-import androidx.compose.ui.window.PopupPositionProvider
+import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntBounds
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.Position
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.height
 import androidx.compose.ui.unit.width
+import androidx.compose.ui.window.Popup
+import androidx.compose.ui.window.PopupPositionProvider
 import kotlin.math.max
 import kotlin.math.min
 
@@ -94,14 +94,14 @@
     dropdownModifier: Modifier = Modifier,
     dropdownContent: @Composable ColumnScope.() -> Unit
 ) {
-    var visibleMenu by state { expanded }
+    var visibleMenu by remember { mutableStateOf(expanded) }
     if (expanded) visibleMenu = true
 
     Box(toggleModifier) {
         toggle()
 
         if (visibleMenu) {
-            var transformOrigin by state { TransformOrigin.Center }
+            var transformOrigin by remember { mutableStateOf(TransformOrigin.Center) }
             val density = DensityAmbient.current
             val popupPositionProvider = DropdownMenuPositionProvider(
                 dropdownOffset,
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
index dce7a75..f315555 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
@@ -19,44 +19,43 @@
 
 package androidx.compose.material
 
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.Text
+import androidx.compose.foundation.currentTextStyle
+import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.ui.Alignment
-import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.FocusModifier
 import androidx.compose.ui.Layout
-import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Placeable
 import androidx.compose.ui.drawBehind
-import androidx.compose.ui.layout.id
-import androidx.compose.ui.layout.layoutId
-import androidx.compose.ui.unit.offset
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.Text
-import androidx.compose.foundation.currentTextStyle
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focusState
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Path
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.drawscope.Stroke
-import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.foundation.layout.padding
-import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.focus.FocusState
-import androidx.compose.ui.focusState
+import androidx.compose.ui.layout.id
+import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.text.InternalTextApi
 import androidx.compose.ui.text.SoftwareKeyboardController
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.constrain
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.input.VisualTransformation
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.offset
 import kotlin.math.max
 import kotlin.math.roundToInt
 
@@ -136,7 +135,7 @@
     inactiveColor: Color = MaterialTheme.colors.onSurface,
     errorColor: Color = MaterialTheme.colors.error
 ) {
-    var textFieldValue by state { TextFieldValue() }
+    var textFieldValue by remember { mutableStateOf(TextFieldValue()) }
     if (textFieldValue.text != value) {
         @OptIn(InternalTextApi::class)
         textFieldValue = TextFieldValue(
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
index f09b436..256f408 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
@@ -40,7 +40,6 @@
 import androidx.compose.runtime.onCommit
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
@@ -254,7 +253,7 @@
     onStateChange: (T) -> Unit,
     animationSpec: AnimationSpec<Float> = SpringSpec()
 ): SwipeableState<T> {
-    val forceAnimationCheck = state { false }
+    val forceAnimationCheck = remember { mutableStateOf(false) }
     val clock = AnimationClockAmbient.current.asDisposableClock()
     val swipeableState = remember(clock) {
         SwipeableState(state, clock, animationSpec = animationSpec)
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextField.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
index c86e2f4..78fc4b4 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
@@ -16,41 +16,42 @@
 
 package androidx.compose.material
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.Placeable
-import androidx.compose.ui.layout.id
-import androidx.compose.ui.layout.layoutId
-import androidx.compose.ui.unit.offset
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
 import androidx.compose.foundation.currentTextStyle
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.shape.ZeroCornerSize
+import androidx.compose.foundation.text.LastBaseline
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.AlignmentLine
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.Placeable
+import androidx.compose.ui.drawBehind
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.layout.id
+import androidx.compose.ui.layout.layoutId
+import androidx.compose.ui.text.InternalTextApi
+import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.constrain
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.foundation.layout.padding
-import androidx.compose.ui.text.InternalTextApi
-import androidx.compose.foundation.text.LastBaseline
-import androidx.compose.ui.AlignmentLine
-import androidx.compose.ui.drawBehind
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.constrain
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.offset
 import kotlin.math.max
 import kotlin.math.roundToInt
 
@@ -162,7 +163,7 @@
     shape: Shape =
         MaterialTheme.shapes.small.copy(bottomLeft = ZeroCornerSize, bottomRight = ZeroCornerSize)
 ) {
-    var textFieldValue by state { TextFieldValue() }
+    var textFieldValue by remember { mutableStateOf(TextFieldValue()) }
     if (textFieldValue.text != value) {
         @OptIn(InternalTextApi::class)
         textFieldValue = TextFieldValue(
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
index 7513f6d..7d203b5 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
@@ -19,59 +19,58 @@
 
 package androidx.compose.material
 
+import androidx.compose.animation.ColorPropKey
+import androidx.compose.animation.DpPropKey
 import androidx.compose.animation.core.FloatPropKey
 import androidx.compose.animation.core.TransitionSpec
 import androidx.compose.animation.core.transitionDefinition
 import androidx.compose.animation.core.tween
+import androidx.compose.animation.transition
+import androidx.compose.foundation.BaseTextField
+import androidx.compose.foundation.ContentColorAmbient
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.ProvideTextStyle
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.gestures.rememberScrollableController
+import androidx.compose.foundation.gestures.scrollable
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.preferredSizeIn
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Providers
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.savedinstancestate.Saver
+import androidx.compose.runtime.savedinstancestate.rememberSavedInstanceState
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.stateFor
 import androidx.compose.runtime.structuralEqualityPolicy
-import androidx.compose.animation.ColorPropKey
-import androidx.compose.animation.DpPropKey
-import androidx.compose.animation.transition
-import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.FocusModifier
 import androidx.compose.ui.Layout
 import androidx.compose.ui.LayoutModifier
+import androidx.compose.ui.Measurable
 import androidx.compose.ui.MeasureScope
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Placeable
-import androidx.compose.ui.node.Ref
 import androidx.compose.ui.draw.clipToBounds
-import androidx.compose.ui.unit.constrainWidth
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focusState
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
-import androidx.compose.ui.unit.offset
-import androidx.compose.foundation.ContentColorAmbient
-import androidx.compose.foundation.ProvideTextStyle
-import androidx.compose.foundation.BaseTextField
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.gestures.rememberScrollableController
-import androidx.compose.foundation.gestures.scrollable
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.node.Ref
+import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.preferredSizeIn
-import androidx.compose.runtime.savedinstancestate.Saver
-import androidx.compose.runtime.savedinstancestate.rememberSavedInstanceState
-import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.Measurable
-import androidx.compose.ui.focus.FocusState
-import androidx.compose.ui.focusState
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.lerp
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.constrainWidth
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.offset
 import androidx.compose.ui.util.annotation.VisibleForTesting
 import kotlin.math.min
 import kotlin.math.roundToInt
@@ -112,12 +111,14 @@
     val focusModifier = FocusModifier()
     val keyboardController: Ref<SoftwareKeyboardController> = remember { Ref() }
 
-    val inputState = stateFor(value.text, focusModifier.focusState) {
-        when {
-            focusModifier.focusState == FocusState.Focused -> InputPhase.Focused
-            value.text.isEmpty() -> InputPhase.UnfocusedEmpty
-            else -> InputPhase.UnfocusedNotEmpty
-        }
+    val inputState = remember(value.text, focusModifier.focusState) {
+        mutableStateOf(
+            when {
+                focusModifier.focusState == FocusState.Focused -> InputPhase.Focused
+                value.text.isEmpty() -> InputPhase.UnfocusedEmpty
+                else -> InputPhase.UnfocusedNotEmpty
+            }
+        )
     }
 
     val decoratedPlaceholder: @Composable (() -> Unit)? =
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/ripple/RippleIndication.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/ripple/RippleIndication.kt
index cb08645..7738a1c 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/ripple/RippleIndication.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/ripple/RippleIndication.kt
@@ -16,33 +16,33 @@
 
 package androidx.compose.material.ripple
 
+import androidx.compose.animation.AnimatedFloatModel
+import androidx.compose.animation.asDisposableClock
 import androidx.compose.animation.core.AnimationClockObservable
 import androidx.compose.animation.core.AnimationSpec
 import androidx.compose.animation.core.LinearEasing
 import androidx.compose.animation.core.TweenSpec
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Stable
-import androidx.compose.runtime.State
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.mutableStateListOf
-import androidx.compose.runtime.state
-import androidx.compose.runtime.structuralEqualityPolicy
-import androidx.compose.animation.AnimatedFloatModel
-import androidx.compose.animation.asDisposableClock
-import androidx.compose.ui.platform.AnimationClockAmbient
-import androidx.compose.ui.ContentDrawScope
 import androidx.compose.foundation.Indication
 import androidx.compose.foundation.IndicationInstance
 import androidx.compose.foundation.Interaction
 import androidx.compose.foundation.InteractionState
+import androidx.compose.material.ExperimentalMaterialApi
+import androidx.compose.material.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.ui.ContentDrawScope
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.clipRect
 import androidx.compose.ui.graphics.useOrElse
-import androidx.compose.material.ExperimentalMaterialApi
-import androidx.compose.material.MaterialTheme
+import androidx.compose.ui.platform.AnimationClockAmbient
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.util.nativeClass
@@ -80,7 +80,7 @@
     val theme = RippleThemeAmbient.current
     val clock = AnimationClockAmbient.current.asDisposableClock()
     val resolvedColor = color.useOrElse { theme.defaultColor() }
-    val colorState = state(structuralEqualityPolicy()) { resolvedColor }
+    val colorState = remember { mutableStateOf(resolvedColor, structuralEqualityPolicy()) }
     colorState.value = resolvedColor
     val interactionOpacity = theme.rippleOpacity()
     return remember(bounded, radius, theme, clock) {
diff --git a/ui/ui-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt b/ui/ui-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
index d3a0be1..bfd5c19 100644
--- a/ui/ui-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
+++ b/ui/ui-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
@@ -18,8 +18,9 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.onPreCommit
-import androidx.compose.runtime.state
+import androidx.compose.runtime.remember
 import io.reactivex.Completable
 import io.reactivex.Flowable
 import io.reactivex.Maybe
@@ -210,7 +211,7 @@
     initial: T,
     crossinline subscribe: S.((T) -> Unit) -> Disposable
 ): State<T> {
-    val state = state { initial }
+    val state = remember { mutableStateOf(initial) }
     onPreCommit(this) {
         val disposable = subscribe {
             state.value = it
diff --git a/ui/ui-saved-instance-state/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/SavedInstanceState.kt b/ui/ui-saved-instance-state/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/SavedInstanceState.kt
index 8664eed..0c65716 100644
--- a/ui/ui-saved-instance-state/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/SavedInstanceState.kt
+++ b/ui/ui-saved-instance-state/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/SavedInstanceState.kt
@@ -20,15 +20,14 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.SnapshotMutationPolicy
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.state
 import androidx.compose.runtime.structuralEqualityPolicy
 
 /**
  * Used to introduce a state value of type [T] into a composition.
  *
- * It behaves similarly to [state], but the stored value will survive the activity or process
- * recreation using the saved instance state mechanism (for example it happens when the screen is
- * rotated in the Android application).
+ * It behaves similarly to `remember { mutableStateOf(...) }`, but the stored value will survive
+ * the activity or process recreation using the saved instance state mechanism (for example it
+ * happens when the screen is rotated in the Android application).
  *
  * @sample androidx.compose.runtime.savedinstancestate.samples.SavedInstanceStateSample
  *
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AndroidComposeTestCaseRunnerTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AndroidComposeTestCaseRunnerTest.kt
index 06eaf46..ac8b7dd 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AndroidComposeTestCaseRunnerTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AndroidComposeTestCaseRunnerTest.kt
@@ -16,13 +16,13 @@
 
 package androidx.ui.test
 
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.onPreCommit
-import androidx.compose.runtime.state
+import androidx.compose.runtime.remember
 import androidx.test.filters.SmallTest
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.Text
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -69,7 +69,7 @@
     // @Test //- TODO: Does not work, performs only 1 frame until stable
     fun foreverRecomposing_viaState_shouldFail() {
         composeTestRule.forGivenContent {
-            val state = state { 0 }
+            val state = remember { mutableStateOf(0) }
             Text("Hello ${state.value}")
             state.value++
         }.performTestWithEventsControl {
@@ -83,7 +83,7 @@
     // @Test //- TODO: Does not work, performs only 1 frame until stable
     fun foreverRecomposing_viaStatePreCommit_shouldFail() {
         composeTestRule.forGivenContent {
-            val state = state { 0 }
+            val state = remember { mutableStateOf(0) }
             Text("Hello ${state.value}")
             onPreCommit {
                 state.value++
@@ -119,7 +119,7 @@
     @Test
     fun recomposeOnce() {
         composeTestRule.forGivenContent {
-            val state = state { 0 }
+            val state = remember { mutableStateOf(0) }
             if (state.value < 1) {
                 state.value++
             }
@@ -132,7 +132,7 @@
     // @Test //- TODO: Does not work, performs only 1 frame until stable
     fun recomposeTwice() {
         composeTestRule.forGivenContent {
-            val state = state { 0 }
+            val state = remember { mutableStateOf(0) }
             if (state.value < 2) {
                 state.value++
             }
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AssertExistsTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AssertExistsTest.kt
index 7ab7417..7dcc1bc 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AssertExistsTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AssertExistsTest.kt
@@ -16,16 +16,17 @@
 
 package androidx.ui.test
 
-import androidx.compose.runtime.state
-import androidx.test.filters.FlakyTest
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.layout.Column
 import androidx.compose.material.Button
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Surface
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.MediumTest
 import androidx.ui.test.util.expectAssertionError
 import org.junit.Rule
 import org.junit.Test
@@ -45,7 +46,7 @@
         composeTestRule.setContent {
             MaterialTheme {
                 Surface {
-                    val (showText, toggle) = state { true }
+                    val (showText, toggle) = remember { mutableStateOf(true) }
                     Column {
                         Button(
                             modifier = Modifier.testTag("MyButton"),
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/CallSemanticsActionTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/CallSemanticsActionTest.kt
index 0de9fc3..454e800 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/CallSemanticsActionTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/CallSemanticsActionTest.kt
@@ -16,16 +16,17 @@
 
 package androidx.ui.test
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.semantics.semantics
 import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.semantics.AccessibilityAction
 import androidx.compose.ui.semantics.SemanticsPropertyKey
 import androidx.compose.ui.semantics.SemanticsPropertyReceiver
 import androidx.compose.ui.semantics.accessibilityLabel
+import androidx.compose.ui.semantics.semantics
+import androidx.test.filters.MediumTest
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -41,7 +42,7 @@
     @Test
     fun performSemanticsAction() {
         composeTestRule.setContent {
-            val state = state { "Nothing" }
+            val state = remember { mutableStateOf("Nothing") }
             BoundaryNode {
                 setString("SetString") { state.value = it; return@setString true }
                 accessibilityLabel = state.value
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/ErrorMessagesTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/ErrorMessagesTest.kt
index 103891b..f0d786c 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/ErrorMessagesTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/ErrorMessagesTest.kt
@@ -16,18 +16,19 @@
 
 package androidx.ui.test
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Column
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Surface
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsActions
+import androidx.test.filters.MediumTest
 import androidx.ui.test.util.expectErrorMessage
 import androidx.ui.test.util.expectErrorMessageStartsWith
 import org.junit.Rule
@@ -315,7 +316,7 @@
     @Composable
     fun ComposeTextToHideCase() {
         MaterialTheme {
-            val (showText, toggle) = state { true }
+            val (showText, toggle) = remember { mutableStateOf(true) }
             Column {
                 TestButton(
                     modifier = Modifier.testTag("MyButton"),
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/FindAllTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/FindAllTest.kt
index ccedfe9..f1873f8 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/FindAllTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/FindAllTest.kt
@@ -16,12 +16,13 @@
 
 package androidx.ui.test
 
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
 import androidx.compose.foundation.layout.Column
 import androidx.compose.material.Checkbox
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Surface
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.test.filters.MediumTest
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -58,8 +59,8 @@
     @Test
     fun findAllTest_twoComponents_toggleBoth() {
         composeTestRule.setContent {
-            val (checked1, onCheckedChange1) = state { false }
-            val (checked2, onCheckedChange2) = state { false }
+            val (checked1, onCheckedChange1) = remember { mutableStateOf(false) }
+            val (checked2, onCheckedChange2) = remember { mutableStateOf(false) }
             MaterialTheme {
                 Surface {
                     Column {
@@ -110,8 +111,8 @@
         composeTestRule.setContent {
             MaterialTheme {
                 Surface {
-                    val (checked1, onCheckedChange1) = state { false }
-                    val (checked2, onCheckedChange2) = state { false }
+                    val (checked1, onCheckedChange1) = remember { mutableStateOf(false) }
+                    val (checked2, onCheckedChange2) = remember { mutableStateOf(false) }
 
                     Column {
                         Checkbox(
@@ -141,7 +142,7 @@
         composeTestRule.setContent {
             MaterialTheme {
                 Surface {
-                    val (checked, onCheckedChange) = state { false }
+                    val (checked, onCheckedChange) = remember { mutableStateOf(false) }
 
                     Column {
                         Checkbox(
@@ -188,7 +189,7 @@
         composeTestRule.setContent {
             MaterialTheme {
                 Surface {
-                    val (checked, onCheckedChange) = state { false }
+                    val (checked, onCheckedChange) = remember { mutableStateOf(false) }
 
                     Column {
                         Checkbox(
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TextActionsTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TextActionsTest.kt
index 91d1f7d..4adce97 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TextActionsTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TextActionsTest.kt
@@ -16,15 +16,16 @@
 
 package androidx.ui.test
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
 import androidx.compose.foundation.BaseTextField
 import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.TextFieldValue
+import androidx.test.filters.MediumTest
 import androidx.ui.test.util.BoundaryNode
 import androidx.ui.test.util.expectError
 import androidx.ui.test.util.expectErrorMessageStartsWith
@@ -50,7 +51,7 @@
         onImeActionPerformed: (ImeAction) -> Unit = {},
         textCallback: (String) -> Unit = {}
     ) {
-        val state = state { TextFieldValue("") }
+        val state = remember { mutableStateOf(TextFieldValue("")) }
         BaseTextField(
             modifier = Modifier.testTag(fieldTag),
             value = state.value,
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TimeOutTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TimeOutTest.kt
index f9da6c3..9728dca 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TimeOutTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TimeOutTest.kt
@@ -17,22 +17,22 @@
 package androidx.ui.test
 
 import androidx.activity.ComponentActivity
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.Text
+import androidx.compose.foundation.layout.Stack
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.state
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.onPositioned
 import androidx.test.espresso.AppNotIdleException
 import androidx.test.espresso.IdlingPolicies
 import androidx.test.espresso.IdlingPolicy
 import androidx.test.espresso.IdlingRegistry
 import androidx.test.espresso.IdlingResource
 import androidx.test.filters.LargeTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.onPositioned
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.Text
-import androidx.compose.foundation.layout.Stack
-import androidx.ui.test.android.createAndroidComposeRule
 import androidx.ui.test.android.ComposeNotIdleException
+import androidx.ui.test.android.createAndroidComposeRule
 import androidx.ui.test.util.expectError
 import org.junit.After
 import org.junit.Before
@@ -72,7 +72,7 @@
     @Composable
     fun infiniteCase() {
         Stack {
-            val infiniteCounter = state { 0 }
+            val infiniteCounter = remember { mutableStateOf(0) }
             Box(Modifier.onPositioned {
                 infiniteCounter.value += 1
             }) {
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputField.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputField.kt
index 6b1ad56..1b007a8 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputField.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputField.kt
@@ -16,18 +16,19 @@
 
 package androidx.compose.foundation.text.demos
 
-import androidx.compose.runtime.Composable
 import androidx.compose.foundation.BaseTextField
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.ScrollableColumn
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.key
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.savedinstancestate.savedInstanceState
-import androidx.compose.runtime.state
+import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.ui.text.TextStyle
 
 private val KEYBOARD_TYPES = listOf(
     Pair(KeyboardType.Text, "Text"),
@@ -82,7 +83,7 @@
     keyboardType: KeyboardType = KeyboardType.Text,
     imeAction: ImeAction = ImeAction.Unspecified
 ) {
-    val controller = state<SoftwareKeyboardController?> { null }
+    val controller = remember { mutableStateOf<SoftwareKeyboardController?>(null) }
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
     BaseTextField(
         value = state.value,
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputFieldFocusTransition.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputFieldFocusTransition.kt
index 6855793..5b66493 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputFieldFocusTransition.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputFieldFocusTransition.kt
@@ -16,17 +16,18 @@
 
 package androidx.compose.foundation.text.demos
 
-import androidx.compose.runtime.Composable
 import androidx.compose.foundation.BaseTextField
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.ScrollableColumn
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.savedinstancestate.savedInstanceState
-import androidx.compose.runtime.state
 import androidx.compose.ui.FocusModifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.sp
 
 @Composable
@@ -55,7 +56,7 @@
     val state = savedInstanceState(saver = TextFieldValue.Saver) {
         TextFieldValue("Focus Transition Test")
     }
-    val focused = state { false }
+    val focused = remember { mutableStateOf(false) }
     val color = if (focused.value) {
         Color.Red
     } else {
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelection.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelection.kt
index bdac165..b5ce54e 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelection.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelection.kt
@@ -16,24 +16,25 @@
 
 package androidx.compose.foundation.text.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.selection.Selection
-import androidx.compose.ui.selection.SelectionContainer
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.text.intl.LocaleList
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.selection.Selection
+import androidx.compose.ui.selection.SelectionContainer
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.annotatedString
 import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.intl.LocaleList
 import androidx.compose.ui.text.withStyle
 
 @Composable
@@ -50,7 +51,7 @@
 
 @Composable
 fun TextDemoSelection() {
-    val selection = state<Selection?> { null }
+    val selection = remember { mutableStateOf<Selection?>(null) }
     val arabicSentence =
         "\nكلمة شين في قاموس المعاني الفوري مجال البحث مصطلحات المعجم الوسيط ،اللغة"
     SelectionContainer(
@@ -95,7 +96,7 @@
 
 @Composable
 fun TextDemoSelectionWithStringInput() {
-    val selection = state<Selection?> { null }
+    val selection = remember { mutableStateOf<Selection?>(null) }
     SelectionContainer(
         selection = selection.value,
         onSelectionChange = { selection.value = it }) {
@@ -128,7 +129,7 @@
         Color(0xFFFF0000)
     )
 
-    val selection = state<Selection?> { null }
+    val selection = remember { mutableStateOf<Selection?>(null) }
     SelectionContainer(
         selection = selection.value,
         onSelectionChange = { selection.value = it }) {
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelectionSample.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelectionSample.kt
index 99b319c..1af05b8 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelectionSample.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelectionSample.kt
@@ -16,19 +16,20 @@
 
 package androidx.compose.foundation.text.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.selection.Selection
-import androidx.compose.ui.selection.SelectionContainer
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.selection.Selection
+import androidx.compose.ui.selection.SelectionContainer
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.annotatedString
@@ -72,7 +73,7 @@
 
 @Composable
 fun TextSelectionSample() {
-    val selection = state<Selection?> { null }
+    val selection = remember { mutableStateOf<Selection?>(null) }
     ScrollableColumn {
         SelectionContainer(
             selection = selection.value,
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeVariousInputField.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeVariousInputField.kt
index 335a0c7..84aad37 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeVariousInputField.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeVariousInputField.kt
@@ -16,22 +16,27 @@
 
 package androidx.compose.foundation.text.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.emptyContent
 import androidx.compose.foundation.BaseTextField
-import androidx.compose.runtime.state
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.layout.id
-import androidx.compose.ui.layout.layoutId
 import androidx.compose.foundation.Box
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.Text
 import androidx.compose.foundation.background
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.emptyContent
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.savedinstancestate.savedInstanceState
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.id
+import androidx.compose.ui.layout.layoutId
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextRange
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.text.input.OffsetMap
@@ -40,12 +45,8 @@
 import androidx.compose.ui.text.input.TransformedText
 import androidx.compose.ui.text.input.VisualTransformation
 import androidx.compose.ui.text.intl.LocaleList
-import androidx.compose.runtime.savedinstancestate.savedInstanceState
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.TextLayoutResult
-import androidx.compose.ui.text.TextRange
-import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.toUpperCase
+import androidx.compose.ui.unit.Constraints
 import kotlin.math.roundToInt
 
 /**
@@ -322,7 +323,7 @@
 @OptIn(ExperimentalFoundationApi::class)
 private fun CustomCursorTextField(cursor: @Composable () -> Unit) {
     val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
-    val layoutResult = state<TextLayoutResult?> { null }
+    val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
     Layout({
         BaseTextField(
             modifier = Modifier.layoutId("inputField"),
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/InteractiveText.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/InteractiveText.kt
index e3e22d0..6c1d83b 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/InteractiveText.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/InteractiveText.kt
@@ -16,11 +16,12 @@
 
 package androidx.compose.foundation.text.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
 import androidx.compose.foundation.ClickableText
 import androidx.compose.foundation.ScrollableColumn
 import androidx.compose.foundation.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
 import androidx.compose.ui.text.AnnotatedString
 
 @Composable
@@ -30,7 +31,7 @@
 
 @Composable
 fun TextOnClick() {
-    val clickedOffset = state { -1 }
+    val clickedOffset = remember { mutableStateOf(-1) }
     ScrollableColumn {
         Text("Clicked Offset: ${clickedOffset.value}")
         ClickableText(
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/TextFieldWIthScroller.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/TextFieldWIthScroller.kt
index 2fe11ad..3e4e19e 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/TextFieldWIthScroller.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/TextFieldWIthScroller.kt
@@ -16,23 +16,26 @@
 
 package androidx.compose.foundation.text.demos
 
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.foundation.ScrollableColumn
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.BaseTextField
 import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.ScrollableColumn
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.unit.dp
 
 @Composable
 @OptIn(ExperimentalFoundationApi::class)
 fun TextFieldWithScrollerDemo() {
     ScrollableColumn {
-        val state = state {
-            TextFieldValue(
-                text = List(100) { "Line: $it" }.joinToString("\n")
+        val state = remember {
+            mutableStateOf(
+                TextFieldValue(
+                    text = List(100) { "Line: $it" }.joinToString("\n")
+                )
             )
         }
         BaseTextField(
diff --git a/ui/ui-text/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt b/ui/ui-text/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
index c93a8ef..44b2a8e 100644
--- a/ui/ui-text/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
+++ b/ui/ui-text/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
@@ -19,6 +19,8 @@
 
 package androidx.compose.foundation.text
 
+import androidx.compose.foundation.text.selection.SelectionHandle
+import androidx.compose.foundation.text.selection.TextFieldSelectionManager
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.emptyContent
 import androidx.compose.runtime.getValue
@@ -27,41 +29,32 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.runtime.state
+import androidx.compose.ui.FocusModifier
 import androidx.compose.ui.Layout
-import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.onPositioned
+import androidx.compose.ui.drawBehind
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focusState
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.gesture.DragObserver
 import androidx.compose.ui.gesture.LongPressDragObserver
 import androidx.compose.ui.gesture.dragGestureFilter
 import androidx.compose.ui.gesture.longPressDragGestureFilter
 import androidx.compose.ui.gesture.pressIndicatorGestureFilter
-import androidx.compose.ui.selection.SelectionLayout
-import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.drawscope.drawCanvas
-import androidx.compose.ui.text.input.EditProcessor
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.text.input.NO_SESSION
-import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.ui.semantics.onClick
-import androidx.compose.foundation.text.selection.SelectionHandle
-import androidx.compose.foundation.text.selection.TextFieldSelectionManager
-import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.drawBehind
-import androidx.compose.ui.focus.FocusState
-import androidx.compose.ui.focusState
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.onPositioned
 import androidx.compose.ui.platform.ClipboardManagerAmbient
 import androidx.compose.ui.platform.DensityAmbient
 import androidx.compose.ui.platform.FontLoaderAmbient
 import androidx.compose.ui.platform.HapticFeedBackAmbient
 import androidx.compose.ui.platform.TextInputServiceAmbient
 import androidx.compose.ui.platform.TextToolbarAmbient
-import kotlin.math.max
+import androidx.compose.ui.selection.SelectionLayout
 import androidx.compose.ui.semantics.focused
 import androidx.compose.ui.semantics.getTextLayoutResult
+import androidx.compose.ui.semantics.onClick
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.setSelection
 import androidx.compose.ui.semantics.setText
 import androidx.compose.ui.semantics.text
@@ -74,6 +67,13 @@
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.constrain
+import androidx.compose.ui.text.input.EditProcessor
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.input.NO_SESSION
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.input.VisualTransformation
+import kotlin.math.max
 import kotlin.math.roundToInt
 
 @Suppress("DEPRECATION")
@@ -93,7 +93,7 @@
     onTextLayout: (TextLayoutResult) -> Unit = {},
     onTextInputStarted: (SoftwareKeyboardController) -> Unit = {}
 ) {
-    val fullModel = state { TextFieldValue() }
+    val fullModel = remember { mutableStateOf(TextFieldValue()) }
     if (fullModel.value.text != value.text ||
         fullModel.value.selection != value.selection ||
         fullModel.value.composition != value.composition) {
@@ -196,7 +196,10 @@
     // and IME may think it is updated. To fix this inconsistent state, enforce recompose by
     // incrementing generation counter when we callback to the developer and reset the state with
     // the latest state.
-    val generation = state { 0 }
+
+    // BUG: b/162464429 - this can throw, "Expected a group" exceptions if changed to the
+    //      suggested equivalent for the deprecated state {} function.
+    val generation = state { 0 } // remember { mutableStateOf(0) }
     val Wrapper: @Composable (Int, @Composable () -> Unit) -> Unit = { _, child -> child() }
     val onValueChangeWrapper: (TextFieldValue) -> Unit = { onValueChange(it); generation.value++ }
 
@@ -474,7 +477,7 @@
     onBlur: (hasNextClient: Boolean) -> Unit,
     focusModifier: FocusModifier
 ): Modifier {
-    val prevState = state { FocusState.NotFocused }
+    val prevState = remember { mutableStateOf(FocusState.NotFocused) }
     if (focusModifier.focusState == FocusState.Focused &&
         prevState.value == FocusState.NotFocused
     ) {
@@ -611,7 +614,7 @@
     onRelease: (Offset) -> Unit,
     longPressDragObserver: LongPressDragObserver
 ): Modifier {
-    val tracker = state { DragEventTracker() }
+    val tracker = remember { DragEventTracker() }
     // TODO(shepshapard): PressIndicator doesn't seem to be the right thing to use here.  It
     //  actually may be functionally correct, but might mostly suggest that it should not
     //  actually be called PressIndicator, but instead something else.
@@ -619,15 +622,15 @@
     return this
         .pressIndicatorGestureFilter(
             onStart = {
-                tracker.value.init(it)
+                tracker.init(it)
                 onPress(it)
             }, onStop = {
-                onRelease(tracker.value.getPosition())
+                onRelease(tracker.getPosition())
             })
         .dragGestureFilter(dragObserver = object :
             DragObserver {
             override fun onDrag(dragDistance: Offset): Offset {
-                tracker.value.onDrag(dragDistance)
+                tracker.onDrag(dragDistance)
                 return Offset.Zero
             }
         })
diff --git a/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewActivity.kt b/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewActivity.kt
index 9a43009..68c479d 100644
--- a/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewActivity.kt
+++ b/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewActivity.kt
@@ -20,12 +20,13 @@
 import android.os.Bundle
 import android.util.Log
 import androidx.activity.ComponentActivity
-import androidx.compose.runtime.currentComposer
-import androidx.compose.runtime.state
-import androidx.compose.ui.platform.setContent
 import androidx.compose.foundation.Text
 import androidx.compose.material.ExtendedFloatingActionButton
 import androidx.compose.material.Scaffold
+import androidx.compose.runtime.currentComposer
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.setContent
 
 /**
  * Activity used to run `@Composable` previews from Android Studio.
@@ -98,7 +99,7 @@
         // cycle through all the values.
         if (previewParameters.size > 1) {
             setContent {
-                val index = state { 0 }
+                val index = remember { mutableStateOf(0) }
 
                 Scaffold(bodyContent = {
                     invokeComposableViaReflection(